diff --git a/Plugin/CutGrid.cpp b/Plugin/CutGrid.cpp index f1b60402c21751e1552732fe0ab7d7b2a8c44a8c..031425bb816b4a5899edbe2ddbe76ed96183f672 100644 --- a/Plugin/CutGrid.cpp +++ b/Plugin/CutGrid.cpp @@ -1,4 +1,4 @@ -// $Id: CutGrid.cpp,v 1.16 2005-03-02 07:49:41 geuzaine Exp $ +// $Id: CutGrid.cpp,v 1.17 2005-03-04 19:08:38 geuzaine Exp $ // // Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle // @@ -365,11 +365,9 @@ Post_View * GMSH_CutGridPlugin::GenerateView(Post_View * v, int connect) } if(nbv){ - double sizeElem; for(int i = 0; i < getNbU(); i++) for(int j = 0; j < getNbV(); j++) - o.searchVector(pnts[i][j][0], pnts[i][j][1], pnts[i][j][2], vals[i][j], - &sizeElem); + o.searchVector(pnts[i][j][0], pnts[i][j][1], pnts[i][j][2], vals[i][j]); addInView(v, connect, 3, pnts, vals, View->VP, &View->NbVP, View->VL, &View->NbVL, View->VQ, &View->NbVQ); } diff --git a/Plugin/CutParametric.cpp b/Plugin/CutParametric.cpp index fe2f81321d7676ff28f1e666e8428e9755739d5e..0dd141877190c13e6926352967a39d6ceaa4bbd1 100644 --- a/Plugin/CutParametric.cpp +++ b/Plugin/CutParametric.cpp @@ -1,4 +1,4 @@ -// $Id: CutParametric.cpp,v 1.12 2005-03-02 08:14:29 geuzaine Exp $ +// $Id: CutParametric.cpp,v 1.13 2005-03-04 19:08:38 geuzaine Exp $ // // Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle // @@ -227,8 +227,7 @@ Post_View *GMSH_CutParametricPlugin::execute(Post_View * v) v2->SP, &v2->NbSP, v2->SL, &v2->NbSL); } if(v->NbVT || v->NbVQ || v->NbVS || v->NbVH || v->NbVI || v->NbVY){ - double size; - o.searchVector(x, y, z, res, &size); + o.searchVector(x, y, z, res); addInView(connect, i, 3, v1->NbTimeStep, x0, y0, z0, res0, x, y, z, res, v2->VP, &v2->NbVP, v2->VL, &v2->NbVL); } diff --git a/Plugin/Evaluate.cpp b/Plugin/Evaluate.cpp index d8c66b893a9e4a2333ac4bff71a74413b02c1cd2..2a5568a2928b6f7e5621a952aca453d07c9df07c 100644 --- a/Plugin/Evaluate.cpp +++ b/Plugin/Evaluate.cpp @@ -1,4 +1,4 @@ -// $Id: Evaluate.cpp,v 1.18 2005-03-03 21:31:59 geuzaine Exp $ +// $Id: Evaluate.cpp,v 1.19 2005-03-04 19:08:38 geuzaine Exp $ // // Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle // @@ -184,14 +184,14 @@ void GMSH_EvaluatePlugin::evaluate(Post_View *v1, List_T *list1, int nbElm1, for(int k = 0; k < nbComp; k++) v[k] = val1[k]; // store data from the external view into w - double *val2, tmp[9], sizeElm; + double *val2, tmp[9]; double w[9] = {0., 0., 0., 0., 0., 0., 0., 0., 0.}; if(_octree){ val2 = tmp; if(_octree->searchScalar(x[j], y[j], z[j], val2, timeStep2)){ w[0] = val2[0]; } - else if(_octree->searchVector(x[j], y[j], z[j], val2, &sizeElm, timeStep2)){ + else if(_octree->searchVector(x[j], y[j], z[j], val2, timeStep2)){ for(int k = 0; k < 3; k++) w[k] = val2[k]; } else if(_octree->searchTensor(x[j], y[j], z[j], val2, timeStep2)){ diff --git a/Plugin/OctreePost.cpp b/Plugin/OctreePost.cpp index 1022ee03ad247351f96a051539b693959dd7a9fb..c5d07c10ae5a9a972cb09646bdc92cd84b6e4796 100644 --- a/Plugin/OctreePost.cpp +++ b/Plugin/OctreePost.cpp @@ -1,4 +1,4 @@ -// $Id: OctreePost.cpp,v 1.14 2005-03-02 07:49:41 geuzaine Exp $ +// $Id: OctreePost.cpp,v 1.15 2005-03-04 19:08:38 geuzaine Exp $ // // Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle // @@ -276,7 +276,7 @@ OctreePost::OctreePost(Post_View *v) } bool OctreePost::getValue(void *in, int dim, int nbNod, int nbComp, - double P[3], int timestep, double *values) + double P[3], int timestep, double *values, double *size_elem) { if(!in) return false; @@ -299,12 +299,15 @@ bool OctreePost::getValue(void *in, int dim, int nbNod, int nbComp, U[0], U[1], U[2], nbComp); } + if(size_elem) + *size_elem = e->maxEdgeLength(); + delete e; return true; } -bool OctreePost::searchScalar(double x, double y, double z, - double * values, int timestep) +bool OctreePost::searchScalar(double x, double y, double z, double *values, + int timestep, double *size_elem) { double P[3] = {x, y, z}; @@ -314,18 +317,18 @@ bool OctreePost::searchScalar(double x, double y, double z, else values[0] = 0.0; - if(getValue(Octree_Search(P, SS), 3, 4, 1, P, timestep, values)) return true; - if(getValue(Octree_Search(P, SH), 3, 8, 1, P, timestep, values)) return true; - if(getValue(Octree_Search(P, SI), 3, 6, 1, P, timestep, values)) return true; - if(getValue(Octree_Search(P, SY), 3, 5, 1, P, timestep, values)) return true; - if(getValue(Octree_Search(P, ST), 2, 3, 1, P, timestep, values)) return true; - if(getValue(Octree_Search(P, SQ), 2, 4, 1, P, timestep, values)) return true; + if(getValue(Octree_Search(P, SS), 3, 4, 1, P, timestep, values, size_elem)) return true; + if(getValue(Octree_Search(P, SH), 3, 8, 1, P, timestep, values, size_elem)) return true; + if(getValue(Octree_Search(P, SI), 3, 6, 1, P, timestep, values, size_elem)) return true; + if(getValue(Octree_Search(P, SY), 3, 5, 1, P, timestep, values, size_elem)) return true; + if(getValue(Octree_Search(P, ST), 2, 3, 1, P, timestep, values, size_elem)) return true; + if(getValue(Octree_Search(P, SQ), 2, 4, 1, P, timestep, values, size_elem)) return true; return false; } -bool OctreePost::searchVector(double x, double y, double z, - double * values, double * size_elem, int timestep) +bool OctreePost::searchVector(double x, double y, double z, double *values, + int timestep, double *size_elem) { double P[3] = {x, y, z}; @@ -336,21 +339,18 @@ bool OctreePost::searchVector(double x, double y, double z, for(int i = 0; i < 3; i++) values[i] = 0.0; - // FIXME: compute this! - *size_elem = 1.; - - if(getValue(Octree_Search(P, VS), 3, 4, 3, P, timestep, values)) return true; - if(getValue(Octree_Search(P, VH), 3, 8, 3, P, timestep, values)) return true; - if(getValue(Octree_Search(P, VI), 3, 6, 3, P, timestep, values)) return true; - if(getValue(Octree_Search(P, VY), 3, 5, 3, P, timestep, values)) return true; - if(getValue(Octree_Search(P, VT), 2, 3, 3, P, timestep, values)) return true; - if(getValue(Octree_Search(P, VQ), 2, 4, 3, P, timestep, values)) return true; + if(getValue(Octree_Search(P, VS), 3, 4, 3, P, timestep, values, size_elem)) return true; + if(getValue(Octree_Search(P, VH), 3, 8, 3, P, timestep, values, size_elem)) return true; + if(getValue(Octree_Search(P, VI), 3, 6, 3, P, timestep, values, size_elem)) return true; + if(getValue(Octree_Search(P, VY), 3, 5, 3, P, timestep, values, size_elem)) return true; + if(getValue(Octree_Search(P, VT), 2, 3, 3, P, timestep, values, size_elem)) return true; + if(getValue(Octree_Search(P, VQ), 2, 4, 3, P, timestep, values, size_elem)) return true; return false; } -bool OctreePost::searchTensor(double x, double y, double z, - double * values, int timestep) +bool OctreePost::searchTensor(double x, double y, double z, double *values, + int timestep, double *size_elem) { double P[3] = {x, y, z}; @@ -361,12 +361,12 @@ bool OctreePost::searchTensor(double x, double y, double z, for(int i = 0; i < 9; i++) values[i] = 0.0; - if(getValue(Octree_Search(P, TS), 3, 4, 9, P, timestep, values)) return true; - if(getValue(Octree_Search(P, TH), 3, 8, 9, P, timestep, values)) return true; - if(getValue(Octree_Search(P, TI), 3, 6, 9, P, timestep, values)) return true; - if(getValue(Octree_Search(P, TY), 3, 5, 9, P, timestep, values)) return true; - if(getValue(Octree_Search(P, TT), 2, 3, 9, P, timestep, values)) return true; - if(getValue(Octree_Search(P, TQ), 2, 4, 9, P, timestep, values)) return true; + if(getValue(Octree_Search(P, TS), 3, 4, 9, P, timestep, values, size_elem)) return true; + if(getValue(Octree_Search(P, TH), 3, 8, 9, P, timestep, values, size_elem)) return true; + if(getValue(Octree_Search(P, TI), 3, 6, 9, P, timestep, values, size_elem)) return true; + if(getValue(Octree_Search(P, TY), 3, 5, 9, P, timestep, values, size_elem)) return true; + if(getValue(Octree_Search(P, TT), 2, 3, 9, P, timestep, values, size_elem)) return true; + if(getValue(Octree_Search(P, TQ), 2, 4, 9, P, timestep, values, size_elem)) return true; return false; } diff --git a/Plugin/OctreePost.h b/Plugin/OctreePost.h index fcbab6b0d237e6c84688b910a3a6f3179a5a8eed..4dd8a1a193e4b8669a3dce2e458e9404dc662a33 100644 --- a/Plugin/OctreePost.h +++ b/Plugin/OctreePost.h @@ -34,7 +34,7 @@ class OctreePost Octree *SY, *VY, *TY; Post_View *theView; bool getValue(void *in, int dim, int nbNod, int nbComp, - double P[3], int timestep, double *values); + double P[3], int timestep, double *values, double *size_elem); public : OctreePost(Post_View *); ~OctreePost(); @@ -43,12 +43,12 @@ class OctreePost // the post element. If several time steps // are present, they are all interpolated unless // time step is set to a different value than -1. - bool searchScalar(double x, double y, double z, - double * values, int timestep = -1); - bool searchVector(double x, double y, double z, - double * values, double * size_elem, int timestep = -1); - bool searchTensor(double x, double y, double z, - double * values, int timestep = -1); + bool searchScalar(double x, double y, double z, double *values, + int timestep = -1, double *size_elem = 0); + bool searchVector(double x, double y, double z, double *values, + int timestep = -1, double *size_elem = 0); + bool searchTensor(double x, double y, double z, double *values, + int timestep = -1, double *size_elem = 0); }; #endif diff --git a/Plugin/Probe.cpp b/Plugin/Probe.cpp index cc45e2db39fe1307e5d3e66ef1fcee1c02ebadc9..a4bcb99ac7e7a83a793765b66877dbd11914dac8 100644 --- a/Plugin/Probe.cpp +++ b/Plugin/Probe.cpp @@ -1,4 +1,4 @@ -// $Id: Probe.cpp,v 1.8 2005-03-02 07:49:41 geuzaine Exp $ +// $Id: Probe.cpp,v 1.9 2005-03-04 19:08:38 geuzaine Exp $ // // Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle // @@ -183,8 +183,7 @@ Post_View *GMSH_ProbePlugin::execute(Post_View * v) v2->NbSP++; } - double sizeElem; - if(o.searchVector(x, y, z, val, &sizeElem)){ + if(o.searchVector(x, y, z, val)){ List_Add(v2->VP, &x); List_Add(v2->VP, &y); List_Add(v2->VP, &z); diff --git a/Plugin/ShapeFunctions.h b/Plugin/ShapeFunctions.h index ccc11d8ce0ecc23622a2ae28cc9820125c3deab8..576af3247724432d418170f55a27102ceb42018f 100644 --- a/Plugin/ShapeFunctions.h +++ b/Plugin/ShapeFunctions.h @@ -34,6 +34,8 @@ public: virtual int getDimension() = 0; virtual int getNumNodes() = 0; virtual void getNode(int num, double &u, double &v, double &w) = 0; + virtual int getNumEdges() = 0; + virtual void getEdge(int num, int &start, int &end) = 0; virtual int getNumGaussPoints() = 0; virtual void getGaussPoint(int num, double &u, double &v, double &w, double &weight) = 0; virtual void getShapeFunction(int num, double u, double v, double w, double &s) = 0; @@ -69,9 +71,9 @@ public: prodve(a, b, c); jac[2][0] = c[0]; jac[2][1] = c[1]; jac[2][2] = c[2]; } - return sqrt(DSQR(jac[0][0] * jac[1][1] - jac[0][1] * jac[1][0]) + - DSQR(jac[0][2] * jac[1][0] - jac[0][0] * jac[1][2]) + - DSQR(jac[0][1] * jac[1][2] - jac[0][2] * jac[1][1])); + return sqrt(SQR(jac[0][0] * jac[1][1] - jac[0][1] * jac[1][0]) + + SQR(jac[0][2] * jac[1][0] - jac[0][0] * jac[1][2]) + + SQR(jac[0][1] * jac[1][2] - jac[0][2] * jac[1][1])); case 1: for(int i = 0; i < getNumNodes(); i++) { getGradShapeFunction(i, u, v, w, s); @@ -91,7 +93,7 @@ public: jac[1][0] = b[0]; jac[1][1] = b[1]; jac[1][2] = b[2]; jac[2][0] = c[0]; jac[2][1] = c[1]; jac[2][2] = c[2]; } - return sqrt(DSQR(jac[0][0])+DSQR(jac[0][1])+DSQR(jac[0][2])); + return sqrt(SQR(jac[0][0])+SQR(jac[0][1])+SQR(jac[0][2])); default: return 1.; } @@ -230,6 +232,17 @@ public: //if(error > tol) Msg(WARNING, "Newton did not converge in xyz2uvw") ; } virtual int isInside(double u, double v, double w) = 0; + double maxEdgeLength() + { + double max = 0.; + for(int i = 0; i < getNumEdges(); i++){ + int n1, n2; + getEdge(i, n1, n2); + double d = sqrt(SQR(_x[n1]-_x[n2]) + SQR(_y[n1]-_y[n2]) + SQR(_z[n1]-_z[n2])); + if(d > max) max = d; + } + return max; + } }; class point : public element{ @@ -241,6 +254,11 @@ public: { u = v = w = 0.; } + inline int getNumEdges(){ return 0; } + void getEdge(int num, int &start, int &end) + { + start = end = 0; + } inline int getNumGaussPoints(){ return 1; } void getGaussPoint(int num, double &u, double &v, double &w, double &weight) { @@ -282,6 +300,11 @@ public: default: u = 0.; break; } } + inline int getNumEdges(){ return 1; } + void getEdge(int num, int &start, int &end) + { + start = 0; end = 1; + } inline int getNumGaussPoints(){ return 1; } void getGaussPoint(int num, double &u, double &v, double &w, double &weight) { @@ -339,6 +362,16 @@ public: default: u = 0.; v = 0.; break; } } + inline int getNumEdges(){ return 3; } + void getEdge(int num, int &start, int &end) + { + switch(num) { + case 0 : start = 0; end = 1; break; + case 1 : start = 1; end = 2; break; + case 2 : start = 2; end = 0; break; + default: start = end = 0; break; + } + } inline int getNumGaussPoints(){ return 3; } void getGaussPoint(int num, double &u, double &v, double &w, double &weight) { @@ -421,6 +454,17 @@ public: default: u = 0.; v = 0.; break; } } + inline int getNumEdges(){ return 4; } + void getEdge(int num, int &start, int &end) + { + switch(num) { + case 0 : start = 0; end = 1; break; + case 1 : start = 1; end = 2; break; + case 2 : start = 2; end = 3; break; + case 3 : start = 3; end = 0; break; + default: start = end = 0; break; + } + } inline int getNumGaussPoints(){ return 4; } void getGaussPoint(int num, double &u, double &v, double &w, double &weight) { @@ -490,6 +534,19 @@ public: default: u = 0.; v = 0.; w = 0.; break; } } + inline int getNumEdges(){ return 6; } + void getEdge(int num, int &start, int &end) + { + switch(num) { + case 0 : start = 0; end = 1; break; + case 1 : start = 1; end = 2; break; + case 2 : start = 2; end = 0; break; + case 3 : start = 3; end = 0; break; + case 4 : start = 3; end = 2; break; + case 5 : start = 3; end = 1; break; + default: start = end = 0; break; + } + } inline int getNumGaussPoints(){ return 4; } void getGaussPoint(int num, double &u, double &v, double &w, double &weight) { @@ -568,6 +625,25 @@ public: default: u = 0.; v = 0.; w = 0.; break; } } + inline int getNumEdges(){ return 12; } + void getEdge(int num, int &start, int &end) + { + switch(num) { + case 0 : start = 0; end = 1; break; + case 1 : start = 0; end = 3; break; + case 2 : start = 0; end = 4; break; + case 3 : start = 1; end = 2; break; + case 4 : start = 1; end = 5; break; + case 5 : start = 2; end = 3; break; + case 6 : start = 2; end = 6; break; + case 7 : start = 3; end = 7; break; + case 8 : start = 4; end = 5; break; + case 9 : start = 4; end = 7; break; + case 10: start = 5; end = 6; break; + case 11: start = 6; end = 7; break; + default: start = end = 0; break; + } + } inline int getNumGaussPoints(){ return 6; } void getGaussPoint(int num, double &u, double &v, double &w, double &weight) { @@ -654,6 +730,22 @@ public: default: u = 0.; v = 0.; w = 0.; break; } } + inline int getNumEdges(){ return 9; } + void getEdge(int num, int &start, int &end) + { + switch(num) { + case 0 : start = 0; end = 1; break; + case 1 : start = 0; end = 2; break; + case 2 : start = 0; end = 3; break; + case 3 : start = 1; end = 2; break; + case 4 : start = 1; end = 4; break; + case 5 : start = 2; end = 5; break; + case 6 : start = 3; end = 4; break; + case 7 : start = 3; end = 5; break; + case 8 : start = 4; end = 5; break; + default: start = end = 0; break; + } + } inline int getNumGaussPoints(){ return 6; } void getGaussPoint(int num, double &u, double &v, double &w, double &weight) { @@ -731,6 +823,21 @@ public: default: u = 0.; v = 0.; w = 0.; break; } } + inline int getNumEdges(){ return 8; } + void getEdge(int num, int &start, int &end) + { + switch(num) { + case 0 : start = 0; end = 1; break; + case 1 : start = 0; end = 3; break; + case 2 : start = 0; end = 4; break; + case 3 : start = 1; end = 2; break; + case 4 : start = 1; end = 4; break; + case 5 : start = 2; end = 3; break; + case 6 : start = 2; end = 4; break; + case 7 : start = 3; end = 4; break; + default: start = end = 0; break; + } + } inline int getNumGaussPoints(){ return 8; } void getGaussPoint(int num, double &u, double &v, double &w, double &weight) { @@ -781,16 +888,16 @@ public: switch(num) { case 0 : s[0] = 0.25 * ( -(1.-v) + v*w/(1.-w) ) ; s[1] = 0.25 * ( -(1.-u) + u*w/(1.-w) ) ; - s[2] = 0.25 * ( -1. + u*v/DSQR(1.-w) ) ; break ; + s[2] = 0.25 * ( -1. + u*v/SQR(1.-w) ) ; break ; case 1 : s[0] = 0.25 * ( (1.-v) + v*w/(1.-w) ) ; s[1] = 0.25 * ( -(1.+u) + u*w/(1.-w) ) ; - s[2] = 0.25 * ( -1. + u*v/DSQR(1.-w) ) ; break ; + s[2] = 0.25 * ( -1. + u*v/SQR(1.-w) ) ; break ; case 2 : s[0] = 0.25 * ( (1.+v) + v*w/(1.-w) ) ; s[1] = 0.25 * ( (1.+u) + u*w/(1.-w) ) ; - s[2] = 0.25 * ( -1. + u*v/DSQR(1.-w) ) ; break ; + s[2] = 0.25 * ( -1. + u*v/SQR(1.-w) ) ; break ; case 3 : s[0] = 0.25 * ( -(1.+v) + v*w/(1.-w) ) ; s[1] = 0.25 * ( (1.-u) + u*w/(1.-w) ) ; - s[2] = 0.25 * ( -1. + u*v/DSQR(1.-w) ) ; break ; + s[2] = 0.25 * ( -1. + u*v/SQR(1.-w) ) ; break ; case 4 : s[0] = 0. ; s[1] = 0. ; s[2] = 1. ; break ; diff --git a/Plugin/StreamLines.cpp b/Plugin/StreamLines.cpp index e89465956e8cd52408b6f11dae8658f14bed0d89..148fc759b9c7896710814d921d44090bc1366372 100644 --- a/Plugin/StreamLines.cpp +++ b/Plugin/StreamLines.cpp @@ -1,4 +1,4 @@ -// $Id: StreamLines.cpp,v 1.21 2005-03-02 07:49:41 geuzaine Exp $ +// $Id: StreamLines.cpp,v 1.22 2005-03-04 19:08:38 geuzaine Exp $ // // Copyright (C) 1997-2005 C. Geuzaine, J.-F. Remacle // @@ -238,7 +238,7 @@ Post_View * GMSH_StreamLinesPlugin::GenerateView(int iView, int dView) const const double a1=0.5, a2=0.5, a3=1.0, a4=1.0; const double DT = StreamLinesOptions_Number[12].def; double XINIT[3], X[3], DX[3], X1[3], X2[3], X3[3], X4[3]; - double sizeElem = 0.033, val[3], *val2 = NULL; + double val[3], *val2 = NULL; Post_View *View = BeginView(1); @@ -293,21 +293,22 @@ Post_View * GMSH_StreamLinesPlugin::GenerateView(int iView, int dView) const // X4 = X + a4 * DT * V(X3) // X = X + b1 X1 + b2 X2 + b3 X3 + b4 x4 - o.searchVector(X[0], X[1], X[2], val, &sizeElem, 0); - // double normV = sqrt(val[0]*val[0]+ - // val[1]*val[1]+ - // val[2]*val[2]); + // o.searchVector(X[0], X[1], X[2], val, 0, &sizeElem); + // double normV = sqrt(val[0]*val[0]+val[1]*val[1]+val[2]*val[2]); // if (normV==0.0) normV = 1.0; - // double DT = sizeElem / normV ; /// CFL = 1 ==> secure + // double DT = sizeElem / normV ; // CFL = 1 ==> secure + o.searchVector(X[0], X[1], X[2], val, 0); for(int k = 0; k < 3; k++) X1[k] = X[k] + DT * val[k] * a1; - o.searchVector(X1[0], X1[1], X1[2], val, &sizeElem, 0); + o.searchVector(X1[0], X1[1], X1[2], val, 0); for(int k = 0; k < 3; k++) X2[k] = X[k] + DT * val[k] * a2; - o.searchVector(X2[0], X2[1], X2[2], val, &sizeElem, 0); + o.searchVector(X2[0], X2[1], X2[2], val, 0); for(int k = 0; k < 3; k++) X3[k] = X[k] + DT * val[k] * a3; - o.searchVector(X3[0], X3[1], X3[2], val, &sizeElem, 0); + o.searchVector(X3[0], X3[1], X3[2], val, 0); for(int k = 0; k < 3; k++) X4[k] = X[k] + DT * val[k] * a4; - for(int k = 0; k < 3; k++) X[k] += (b1*(X1[k]-X[k]) + b2*(X2[k]-X[k]) + - b3*(X3[k]-X[k]) + b4*(X4[k]-X[k])) ; + + for(int k = 0; k < 3; k++) + X[k] += (b1*(X1[k]-X[k]) + b2*(X2[k]-X[k]) + + b3*(X3[k]-X[k]) + b4*(X4[k]-X[k])) ; for(int k = 0; k < 3; k++) DX[k] = X[k] - XINIT[k]; if(v2){