Changeset 17242
- Timestamp:
- 02/07/14 16:57:05 (11 years ago)
- Location:
- issm/trunk-jpl/src/c
- Files:
-
- 9 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.cpp
r17241 r17242 18 18 case SSAApproximationEnum: numdofs =2; break; 19 19 case L1L2ApproximationEnum: numdofs =2; break; 20 case HOApproximationEnum: numdofs =2; break; 20 case HOApproximationEnum: 21 switch(meshtype){ 22 case Mesh3DEnum: numdofs=2; break; 23 case Mesh2DverticalEnum: numdofs=1; break; 24 default: _error_("mesh type not supported yet"); 25 } 26 break; 21 27 case SIAApproximationEnum: numdofs =2; break; 22 28 case FSvelocityEnum: … … 478 484 else{ 479 485 IoModelToConstraintsx(constraints,iomodel,StressbalanceSpcvxEnum,StressbalanceAnalysisEnum,finiteelement,1); 480 IoModelToConstraintsx(constraints,iomodel,StressbalanceSpcvyEnum,StressbalanceAnalysisEnum,finiteelement,2); 486 if(iomodel->meshtype==Mesh3DEnum){ 487 IoModelToConstraintsx(constraints,iomodel,StressbalanceSpcvyEnum,StressbalanceAnalysisEnum,finiteelement,2); 488 } 481 489 } 482 490 … … 955 963 956 964 IssmDouble vx,vy; 957 int approximation;965 int meshtype,dim,approximation; 958 966 int* doflist = NULL; 967 968 /*Get some parameters*/ 969 element->FindParam(&meshtype,MeshTypeEnum); 970 switch(meshtype){ 971 case Mesh2DverticalEnum: dim = 2; break; 972 case Mesh3DEnum: dim = 3; break; 973 default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet"); 974 } 959 975 960 976 /*Fetch number of nodes and dof for this finite element*/ 961 977 int numnodes = element->GetNumberOfNodes(); 962 int numdof = numnodes* 2;978 int numdof = numnodes*(dim-1); 963 979 element->GetInputValue(&approximation,ApproximationEnum); 964 980 … … 969 985 /*Get inputs*/ 970 986 Input* vx_input=element->GetInput(VxEnum); _assert_(vx_input); 971 Input* vy_input=element->GetInput(VyEnum); _assert_(vy_input); 987 Input* vy_input=NULL; 988 if(dim==3){vy_input=element->GetInput(VyEnum); _assert_(vy_input);} 972 989 973 990 /*Ok, we have vx and vy in values, fill in vx and vy arrays: */ … … 978 995 /*Recover vx and vy*/ 979 996 vx_input->GetInputValue(&vx,gauss); 980 vy_input->GetInputValue(&vy,gauss); 981 values[i*2+0]=vx; 982 values[i*2+1]=vy; 997 values[i*(dim-1)+0]=vx; 998 if(dim==3){ 999 vy_input->GetInputValue(&vy,gauss); 1000 values[i*(dim-1)+1]=vy; 1001 } 983 1002 } 984 1003 … … 2021 2040 2022 2041 /*Intermediaries*/ 2042 int dim,meshtype,bsize; 2023 2043 IssmDouble viscosity,newviscosity,oldviscosity; 2024 2044 IssmDouble viscosity_overshoot,thickness,Jdet; … … 2026 2046 IssmDouble *xyz_list = NULL; 2027 2047 2048 /*Get problem dimension*/ 2049 element->FindParam(&meshtype,MeshTypeEnum); 2050 switch(meshtype){ 2051 case Mesh2DverticalEnum: dim = 2; bsize = 2; break; 2052 case Mesh3DEnum: dim = 3; bsize = 5; break; 2053 default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet"); 2054 } 2055 2028 2056 /*Fetch number of nodes and dof for this finite element*/ 2029 2057 int numnodes = element->GetNumberOfNodes(); … … 2032 2060 /*Initialize Element matrix and vectors*/ 2033 2061 ElementMatrix* Ke = element->NewElementMatrix(HOApproximationEnum); 2034 IssmDouble* B = xNew<IssmDouble>( 5*numdof);2035 IssmDouble* Bprime = xNew<IssmDouble>( 5*numdof);2036 IssmDouble* D = xNewZeroInit<IssmDouble>( 5*5);2062 IssmDouble* B = xNew<IssmDouble>(bsize*numdof); 2063 IssmDouble* Bprime = xNew<IssmDouble>(bsize*numdof); 2064 IssmDouble* D = xNewZeroInit<IssmDouble>(bsize*bsize); 2037 2065 2038 2066 /*Retrieve all inputs and parameters*/ 2039 2067 element->GetVerticesCoordinates(&xyz_list); 2040 Input* vx_input=element->GetInput(VxEnum); _assert_(vx_input); 2041 Input* vy_input=element->GetInput(VyEnum); _assert_(vy_input); 2042 Input* vxold_input=element->GetInput(VxPicardEnum); _assert_(vxold_input); 2043 Input* vyold_input=element->GetInput(VyPicardEnum); _assert_(vyold_input); 2068 Input* vx_input = element->GetInput(VxEnum); _assert_(vx_input); 2069 Input* vxold_input = element->GetInput(VxPicardEnum); _assert_(vxold_input); 2070 Input* vy_input = NULL; 2071 Input* vyold_input = NULL; 2072 if(dim==3){ 2073 vy_input=element->GetInput(VyEnum); _assert_(vy_input); 2074 vyold_input=element->GetInput(VyPicardEnum); _assert_(vyold_input); 2075 } 2044 2076 element->FindParam(&viscosity_overshoot,StressbalanceViscosityOvershootEnum); 2045 2077 … … 2050 2082 2051 2083 element->JacobianDeterminant(&Jdet,xyz_list,gauss); 2052 this->GetBHO(B,element, xyz_list,gauss);2053 this->GetBHOprime(Bprime,element, xyz_list,gauss);2054 2055 element->ViscosityHO(&viscosity, xyz_list,gauss,vx_input,vy_input);2056 element->ViscosityHO(&oldviscosity, xyz_list,gauss,vxold_input,vyold_input);2084 this->GetBHO(B,element,dim,xyz_list,gauss); 2085 this->GetBHOprime(Bprime,element,dim,xyz_list,gauss); 2086 2087 element->ViscosityHO(&viscosity,dim,xyz_list,gauss,vx_input,vy_input); 2088 element->ViscosityHO(&oldviscosity,dim,xyz_list,gauss,vxold_input,vyold_input); 2057 2089 2058 2090 newviscosity=viscosity+viscosity_overshoot*(viscosity-oldviscosity); 2059 2091 D_scalar=2.*newviscosity*gauss->weight*Jdet; 2060 for(int i=0;i< 5;i++) D[i*5+i]=D_scalar;2061 2062 TripleMultiply(B, 5,numdof,1,2063 D, 5,5,0,2064 Bprime, 5,numdof,0,2092 for(int i=0;i<bsize;i++) D[i*bsize+i]=D_scalar; 2093 2094 TripleMultiply(B,bsize,numdof,1, 2095 D,bsize,bsize,0, 2096 Bprime,bsize,numdof,0, 2065 2097 &Ke->values[0],1); 2066 2098 } … … 2082 2114 2083 2115 /*Intermediaries*/ 2116 int dim,meshtype; 2084 2117 bool mainlyfloating; 2085 2118 int migration_style,point1; … … 2089 2122 Gauss* gauss = NULL; 2090 2123 2124 /*Get problem dimension*/ 2125 element->FindParam(&meshtype,MeshTypeEnum); 2126 switch(meshtype){ 2127 case Mesh2DverticalEnum: dim = 2; break; 2128 case Mesh3DEnum: dim = 3; break; 2129 default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet"); 2130 } 2131 2091 2132 /*Fetch number of nodes and dof for this finite element*/ 2092 2133 int numnodes = element->GetNumberOfNodes(); 2093 int numdof = numnodes* 2;2134 int numdof = numnodes*(dim-1); 2094 2135 2095 2136 /*Initialize Element matrix and vectors*/ 2096 ElementMatrix* Ke 2097 IssmDouble* B = xNew<IssmDouble>(2*numdof);2098 IssmDouble D[2][2] = {0.};2137 ElementMatrix* Ke = element->NewElementMatrix(HOApproximationEnum); 2138 IssmDouble* B = xNew<IssmDouble>((dim-1)*numdof); 2139 IssmDouble* D = xNew<IssmDouble>((dim-1)*(dim-1)); 2099 2140 2100 2141 /*Retrieve all inputs and parameters*/ 2101 2142 element->GetVerticesCoordinatesBase(&xyz_list_base); 2102 2143 element->FindParam(&migration_style,GroundinglineMigrationEnum); 2103 Input* vx_input = element->GetInput(VxEnum);_assert_(vx_input);2104 Input* vy_input = element->GetInput(VyEnum);_assert_(vy_input);2105 Input* vz_input = element->GetInput(VzEnum); _assert_(vz_input);2144 Input* vx_input = element->GetInput(VxEnum); _assert_(vx_input); 2145 Input* vy_input = element->GetInput(VyEnum); _assert_(vy_input); 2146 Input* vz_input = NULL; 2106 2147 Input* gllevelset_input = NULL; 2148 if(dim==3){vz_input=element->GetInput(VzEnum); _assert_(vz_input);} 2107 2149 2108 2150 /*build friction object, used later on: */ … … 2132 2174 } 2133 2175 2134 this->GetBHOFriction(B,element, xyz_list_base,gauss);2176 this->GetBHOFriction(B,element,dim,xyz_list_base,gauss); 2135 2177 element->JacobianDeterminantBase(&Jdet,xyz_list_base,gauss); 2136 for(int i=0;i< 2;i++) D[i][i]=alpha2*gauss->weight*Jdet;2137 2138 TripleMultiply(B, 2,numdof,1,2139 &D[0][0],2,2,0,2140 B, 2,numdof,0,2178 for(int i=0;i<dim-1;i++) D[i*(dim-1)+i]=alpha2*gauss->weight*Jdet; 2179 2180 TripleMultiply(B,dim-1,numdof,1, 2181 D,dim-1,dim-1,0, 2182 B,dim-1,numdof,0, 2141 2183 &Ke->values[0],1); 2142 2184 } … … 2150 2192 xDelete<IssmDouble>(xyz_list_base); 2151 2193 xDelete<IssmDouble>(B); 2194 xDelete<IssmDouble>(D); 2152 2195 return Ke; 2153 2196 }/*}}}*/ … … 2167 2210 2168 2211 /*Intermediaries */ 2212 int dim,meshtype; 2169 2213 IssmDouble Jdet,slope[3]; 2170 2214 IssmDouble* xyz_list = NULL; 2215 2216 /*Get problem dimension*/ 2217 element->FindParam(&meshtype,MeshTypeEnum); 2218 switch(meshtype){ 2219 case Mesh2DverticalEnum: dim = 2; break; 2220 case Mesh3DEnum: dim = 3; break; 2221 default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet"); 2222 } 2171 2223 2172 2224 /*Fetch number of nodes and dof for this finite element*/ … … 2192 2244 2193 2245 for(int i=0;i<numnodes;i++){ 2194 pe->values[i* 2+0]+=-rhog*slope[0]*Jdet*gauss->weight*basis[i];2195 pe->values[i*2+1]+=-rhog*slope[1]*Jdet*gauss->weight*basis[i];2246 pe->values[i*(dim-1)+0]+=-rhog*slope[0]*Jdet*gauss->weight*basis[i]; 2247 if(dim==3) pe->values[i*(dim-1)+1]+=-rhog*slope[1]*Jdet*gauss->weight*basis[i]; 2196 2248 } 2197 2249 } … … 2212 2264 2213 2265 /*Intermediaries*/ 2266 int dim,meshtype; 2214 2267 IssmDouble Jdet,surface,z,water_pressure,ice_pressure; 2215 2268 IssmDouble surface_under_water,base_under_water,pressure; … … 2218 2271 IssmDouble normal[3]; 2219 2272 Gauss* gauss = NULL; 2273 2274 /*Get problem dimension*/ 2275 element->FindParam(&meshtype,MeshTypeEnum); 2276 switch(meshtype){ 2277 case Mesh2DverticalEnum: dim = 2; break; 2278 case Mesh3DEnum: dim = 3; break; 2279 default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet"); 2280 } 2220 2281 2221 2282 /*Fetch number of nodes and dof for this finite element*/ … … 2237 2298 2238 2299 /*Initialize gauss points*/ 2239 IssmDouble zmax=xyz_list[0*3+ 2]; for(int i=1;i<numvertices;i++) if(xyz_list[i*3+2]>zmax) zmax=xyz_list[i*3+2];2240 IssmDouble zmin=xyz_list[0*3+ 2]; for(int i=1;i<numvertices;i++) if(xyz_list[i*3+2]<zmin) zmin=xyz_list[i*3+2];2241 if(zmax>0 && zmin<0) gauss=element->NewGauss(xyz_list,xyz_list_front,3,10);//refined in vertical because of the sea level discontinuity2242 else gauss=element->NewGauss(xyz_list,xyz_list_front,3,3);2300 IssmDouble zmax=xyz_list[0*3+(dim-1)]; for(int i=1;i<numvertices;i++) if(xyz_list[i*3+(dim-1)]>zmax) zmax=xyz_list[i*3+(dim-1)]; 2301 IssmDouble zmin=xyz_list[0*3+(dim-1)]; for(int i=1;i<numvertices;i++) if(xyz_list[i*3+(dim-1)]<zmin) zmin=xyz_list[i*3+(dim-1)]; 2302 if(zmax>0. && zmin<0.) gauss=element->NewGauss(xyz_list,xyz_list_front,3,10);//refined in vertical because of the sea level discontinuity 2303 else gauss=element->NewGauss(xyz_list,xyz_list_front,3,3); 2243 2304 2244 2305 /* Start looping on the number of gaussian points: */ … … 2256 2317 2257 2318 for (int i=0;i<numnodes;i++){ 2258 pe->values[ 2*i+0]+= pressure*Jdet*gauss->weight*normal[0]*basis[i];2259 pe->values[2*i+1]+= pressure*Jdet*gauss->weight*normal[1]*basis[i];2319 pe->values[(dim-1)*i+0]+= pressure*Jdet*gauss->weight*normal[0]*basis[i]; 2320 if(dim==3) pe->values[(dim-1)*i+1]+= pressure*Jdet*gauss->weight*normal[1]*basis[i]; 2260 2321 } 2261 2322 } … … 2271 2332 return pe; 2272 2333 }/*}}}*/ 2273 void StressbalanceAnalysis::GetBHO(IssmDouble* B,Element* element, IssmDouble* xyz_list,Gauss* gauss){/*{{{*/2334 void StressbalanceAnalysis::GetBHO(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/ 2274 2335 /*Compute B matrix. B=[B1 B2 B3 B4 B5 B6] where Bi is of size 5*NDOF2. 2275 2336 * For node i, Bi can be expressed in the actual coordinate system 2276 2337 * by: 2277 * Bi=[ dh/dx 0 ] 2278 * [ 0 dh/dy ] 2279 * [ 1/2*dh/dy 1/2*dh/dx ] 2280 * [ 1/2*dh/dz 0 ] 2281 * [ 0 1/2*dh/dz ] 2338 * 3D 2D 2339 * 2340 * Bi=[ dh/dx 0 ] Bi=[ dh/dx] 2341 * [ 0 dh/dy ] [ dh/dy] 2342 * [ 1/2*dh/dy 1/2*dh/dx ] 2343 * [ 1/2*dh/dz 0 ] 2344 * [ 0 1/2*dh/dz ] 2282 2345 * where h is the interpolation function for node i. 2283 2346 * … … 2289 2352 2290 2353 /*Get nodal functions derivatives*/ 2291 IssmDouble* dbasis=xNew<IssmDouble>( 3*numnodes);2354 IssmDouble* dbasis=xNew<IssmDouble>(dim*numnodes); 2292 2355 element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss); 2293 2356 2294 2357 /*Build B: */ 2295 for(int i=0;i<numnodes;i++){ 2296 B[2*numnodes*0+2*i+0] = dbasis[0*numnodes+i]; 2297 B[2*numnodes*0+2*i+1] = 0.; 2298 B[2*numnodes*1+2*i+0] = 0.; 2299 B[2*numnodes*1+2*i+1] = dbasis[1*numnodes+i]; 2300 B[2*numnodes*2+2*i+0] = .5*dbasis[1*numnodes+i]; 2301 B[2*numnodes*2+2*i+1] = .5*dbasis[0*numnodes+i]; 2302 B[2*numnodes*3+2*i+0] = .5*dbasis[2*numnodes+i]; 2303 B[2*numnodes*3+2*i+1] = 0.; 2304 B[2*numnodes*4+2*i+0] = 0.; 2305 B[2*numnodes*4+2*i+1] = .5*dbasis[2*numnodes+i]; 2306 } 2358 if(dim==2){ 2359 for(int i=0;i<numnodes;i++){ 2360 B[numnodes*0+i] = dbasis[0*numnodes+i]; 2361 B[numnodes*1+i] = .5*dbasis[1*numnodes+i]; 2362 } 2363 } 2364 else{ 2365 for(int i=0;i<numnodes;i++){ 2366 B[2*numnodes*0+2*i+0] = dbasis[0*numnodes+i]; 2367 B[2*numnodes*0+2*i+1] = 0.; 2368 B[2*numnodes*1+2*i+0] = 0.; 2369 B[2*numnodes*1+2*i+1] = dbasis[1*numnodes+i]; 2370 B[2*numnodes*2+2*i+0] = .5*dbasis[1*numnodes+i]; 2371 B[2*numnodes*2+2*i+1] = .5*dbasis[0*numnodes+i]; 2372 B[2*numnodes*3+2*i+0] = .5*dbasis[2*numnodes+i]; 2373 B[2*numnodes*3+2*i+1] = 0.; 2374 B[2*numnodes*4+2*i+0] = 0.; 2375 B[2*numnodes*4+2*i+1] = .5*dbasis[2*numnodes+i]; 2376 } 2377 } 2378 2307 2379 2308 2380 /*Clean-up*/ 2309 2381 xDelete<IssmDouble>(dbasis); 2310 2382 }/*}}}*/ 2311 void StressbalanceAnalysis::GetBHOprime(IssmDouble* Bprime,Element* element, IssmDouble* xyz_list,Gauss* gauss){/*{{{*/2383 void StressbalanceAnalysis::GetBHOprime(IssmDouble* Bprime,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/ 2312 2384 /*Compute B' matrix. B'=[B1' B2' B3'] where Bi' is of size 3*NDOF2. 2313 2385 * For node i, Bi' can be expressed in the actual coordinate system 2314 2386 * by: 2315 * Bi_prime=[ 2*dN/dx dN/dy ] 2316 * [ dN/dx 2*dN/dy ] 2317 * [ dN/dy dN/dx ] 2387 * 3D 2D 2388 * Bi_prime=[ 2*dN/dx dN/dy ] Bi_prime=[ 2*dN/dx ] 2389 * [ dN/dx 2*dN/dy ] [ dN/dy ] 2390 * [ dN/dy dN/dx ] 2318 2391 * where hNis the finiteelement function for node i. 2319 2392 * … … 2325 2398 2326 2399 /*Get nodal functions derivatives*/ 2327 IssmDouble* dbasis=xNew<IssmDouble>( 3*numnodes);2400 IssmDouble* dbasis=xNew<IssmDouble>(dim*numnodes); 2328 2401 element->NodalFunctionsDerivatives(dbasis,xyz_list,gauss); 2329 2402 2330 2403 /*Build B': */ 2331 for(int i=0;i<numnodes;i++){ 2332 Bprime[2*numnodes*0+2*i+0] = 2.*dbasis[0*numnodes+i]; 2333 Bprime[2*numnodes*0+2*i+1] = dbasis[1*numnodes+i]; 2334 Bprime[2*numnodes*1+2*i+0] = dbasis[0*numnodes+i]; 2335 Bprime[2*numnodes*1+2*i+1] = 2.*dbasis[1*numnodes+i]; 2336 Bprime[2*numnodes*2+2*i+0] = dbasis[1*numnodes+i]; 2337 Bprime[2*numnodes*2+2*i+1] = dbasis[0*numnodes+i]; 2338 Bprime[2*numnodes*3+2*i+0] = dbasis[2*numnodes+i]; 2339 Bprime[2*numnodes*3+2*i+1] = 0.; 2340 Bprime[2*numnodes*4+2*i+0] = 0.; 2341 Bprime[2*numnodes*4+2*i+1] = dbasis[2*numnodes+i]; 2342 } 2404 if(dim==3){ 2405 for(int i=0;i<numnodes;i++){ 2406 Bprime[2*numnodes*0+2*i+0] = 2.*dbasis[0*numnodes+i]; 2407 Bprime[2*numnodes*0+2*i+1] = dbasis[1*numnodes+i]; 2408 Bprime[2*numnodes*1+2*i+0] = dbasis[0*numnodes+i]; 2409 Bprime[2*numnodes*1+2*i+1] = 2.*dbasis[1*numnodes+i]; 2410 Bprime[2*numnodes*2+2*i+0] = dbasis[1*numnodes+i]; 2411 Bprime[2*numnodes*2+2*i+1] = dbasis[0*numnodes+i]; 2412 Bprime[2*numnodes*3+2*i+0] = dbasis[2*numnodes+i]; 2413 Bprime[2*numnodes*3+2*i+1] = 0.; 2414 Bprime[2*numnodes*4+2*i+0] = 0.; 2415 Bprime[2*numnodes*4+2*i+1] = dbasis[2*numnodes+i]; 2416 } 2417 } 2418 else{ 2419 for(int i=0;i<numnodes;i++){ 2420 Bprime[numnodes*0+i] = 2.*dbasis[0*numnodes+i]; 2421 Bprime[numnodes*1+i] = dbasis[1*numnodes+i]; 2422 } 2423 } 2343 2424 2344 2425 /*Clean-up*/ 2345 2426 xDelete<IssmDouble>(dbasis); 2346 2427 }/*}}}*/ 2347 void StressbalanceAnalysis::GetBHOFriction(IssmDouble* B,Element* element, IssmDouble* xyz_list,Gauss* gauss){/*{{{*/2428 void StressbalanceAnalysis::GetBHOFriction(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/ 2348 2429 /*Compute B matrix. B=[B1 B2 B3] where Bi is square and of size 2. 2349 2430 * For node i, Bi can be expressed in the actual coordinate system 2350 2431 * by: 2351 * Bi=[ N 0 ] 2432 * 3D 2D 2433 * Bi=[ N 0 ] Bi=N 2352 2434 * [ 0 N ] 2353 2435 * where N is the finiteelement function for node i. … … 2364 2446 2365 2447 /*Build L: */ 2366 for(int i=0;i<numnodes;i++){ 2367 B[2*numnodes*0+2*i+0] = basis[i]; 2368 B[2*numnodes*0+2*i+1] = 0.; 2369 B[2*numnodes*1+2*i+0] = 0.; 2370 B[2*numnodes*1+2*i+1] = basis[i]; 2448 if(dim==3){ 2449 for(int i=0;i<numnodes;i++){ 2450 B[2*numnodes*0+2*i+0] = basis[i]; 2451 B[2*numnodes*0+2*i+1] = 0.; 2452 B[2*numnodes*1+2*i+0] = 0.; 2453 B[2*numnodes*1+2*i+1] = basis[i]; 2454 } 2455 } 2456 else{ 2457 for(int i=0;i<numnodes;i++){ 2458 B[i] = basis[i]; 2459 } 2371 2460 } 2372 2461 … … 2376 2465 void StressbalanceAnalysis::InputUpdateFromSolutionHO(IssmDouble* solution,Element* element){/*{{{*/ 2377 2466 2378 int i ;2467 int i,dim,meshtype; 2379 2468 int* doflist=NULL; 2380 2469 IssmDouble* xyz_list=NULL; 2470 2471 /*Get mesh dimension*/ 2472 element->FindParam(&meshtype,MeshTypeEnum); 2473 switch(meshtype){ 2474 case Mesh2DverticalEnum: dim = 2; break; 2475 case Mesh3DEnum: dim = 3; break; 2476 default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet"); 2477 } 2381 2478 2382 2479 /*Deal with pressure first*/ … … 2395 2492 /*Fetch number of nodes and dof for this finite element*/ 2396 2493 int numnodes = element->GetNumberOfNodes(); 2397 int numdof = numnodes* 2;2494 int numdof = numnodes*(dim-1); 2398 2495 2399 2496 /*Fetch dof list and allocate solution vectors*/ 2400 2497 element->GetDofList(&doflist,HOApproximationEnum,GsetEnum); 2401 IssmDouble* values 2402 IssmDouble* vx 2403 IssmDouble* vy 2404 IssmDouble* vz 2405 IssmDouble* vel 2498 IssmDouble* values = xNew<IssmDouble>(numdof); 2499 IssmDouble* vx = xNew<IssmDouble>(numnodes); 2500 IssmDouble* vy = xNew<IssmDouble>(numnodes); 2501 IssmDouble* vz = xNew<IssmDouble>(numnodes); 2502 IssmDouble* vel = xNew<IssmDouble>(numnodes); 2406 2503 2407 2504 /*Use the dof list to index into the solution vector: */ … … 2413 2510 /*Ok, we have vx and vy in values, fill in vx and vy arrays: */ 2414 2511 for(i=0;i<numnodes;i++){ 2415 vx[i]=values[i*2+0]; 2416 vy[i]=values[i*2+1]; 2417 2418 /*Check solution*/ 2512 vx[i]=values[i*(dim-1)+0]; 2419 2513 if(xIsNan<IssmDouble>(vx[i])) _error_("NaN found in solution vector"); 2420 if(xIsNan<IssmDouble>(vy[i])) _error_("NaN found in solution vector"); 2514 if(dim==3){ 2515 vy[i]=values[i*(dim-1)+1]; 2516 if(xIsNan<IssmDouble>(vy[i])) _error_("NaN found in solution vector"); 2517 } 2421 2518 } 2422 2519 2423 2520 /*Get Vz and compute vel*/ 2424 element->GetInputListOnNodes(&vz[0],VzEnum,0.); 2425 for(i=0;i<numnodes;i++) vel[i]=sqrt(vx[i]*vx[i] + vy[i]*vy[i] + vz[i]*vz[i]); 2521 if(dim==3){ 2522 element->GetInputListOnNodes(&vz[0],VzEnum,0.); 2523 for(i=0;i<numnodes;i++) vel[i]=sqrt(vx[i]*vx[i] + vy[i]*vy[i] + vz[i]*vz[i]); 2524 } 2525 else{ 2526 element->GetInputListOnNodes(&vy[0],VyEnum,0.); 2527 for(i=0;i<numnodes;i++) vel[i]=sqrt(vx[i]*vx[i] + vy[i]*vy[i]); 2528 } 2426 2529 2427 2530 /*Now, we have to move the previous Vx and Vy inputs to old 2428 2531 * status, otherwise, we'll wipe them off: */ 2429 2532 element->InputChangeName(VxEnum,VxPicardEnum); 2430 element->InputChangeName(VyEnum,VyPicardEnum); 2431 element->InputChangeName(PressureEnum,PressurePicardEnum); 2533 if(dim==3)element->InputChangeName(VyEnum,VyPicardEnum); 2432 2534 2433 2535 /*Add vx and vy as inputs to the element: */ … … 2436 2538 //element->AddInput(VelEnum,vel,element->GetElementType()); 2437 2539 element->AddInput(VxEnum,vx,P1Enum); 2438 element->AddInput(VyEnum,vy,P1Enum);2540 if(dim==3)element->AddInput(VyEnum,vy,P1Enum); 2439 2541 element->AddInput(VelEnum,vel,P1Enum); 2440 2542 … … 3579 3681 3580 3682 if(approximation==SSAHOApproximationEnum){ 3581 element->ViscosityHO(&viscosity, xyz_list,gauss,vx_input,vy_input);3582 element->ViscosityHO(&oldviscosity, xyz_list,gauss,vxold_input,vyold_input);3683 element->ViscosityHO(&viscosity,dim,xyz_list,gauss,vx_input,vy_input); 3684 element->ViscosityHO(&oldviscosity,dim,xyz_list,gauss,vxold_input,vyold_input); 3583 3685 newviscosity=viscosity+viscosity_overshoot*(viscosity-oldviscosity); 3584 3686 } … … 3793 3895 friction->GetAlpha2(&alpha2,gauss,vx_input,vy_input,vz_input); 3794 3896 element->JacobianDeterminantBase(&Jdet2d, xyz_list_tria,gauss); 3795 this->GetBHOFriction(L,element, xyz_list_tria,gauss);3897 this->GetBHOFriction(L,element,3,xyz_list_tria,gauss); 3796 3898 3797 3899 DL_scalar=alpha2*gauss->weight*Jdet2d; … … 3878 3980 this->GetBSSAHO(B, element,xyz_list, gauss); 3879 3981 this->GetBSSAprime(Bprime, basaltria,xyz_list, gauss_tria); 3880 element->ViscosityHO(&viscosity, xyz_list,gauss,vx_input,vy_input);3881 element->ViscosityHO(&oldviscosity, xyz_list,gauss,vxold_input,vyold_input);3982 element->ViscosityHO(&viscosity,3,xyz_list,gauss,vx_input,vy_input); 3983 element->ViscosityHO(&oldviscosity,3,xyz_list,gauss,vxold_input,vyold_input); 3882 3984 3883 3985 newviscosity=viscosity+viscosity_overshoot*(viscosity-oldviscosity); -
issm/trunk-jpl/src/c/analyses/StressbalanceAnalysis.h
r17212 r17242 59 59 ElementVector* CreatePVectorHODrivingStress(Element* element); 60 60 ElementVector* CreatePVectorHOFront(Element* element); 61 void GetBHO(IssmDouble* B,Element* element, IssmDouble* xyz_list,Gauss* gauss);62 void GetBHOprime(IssmDouble* B,Element* element, IssmDouble* xyz_list,Gauss* gauss);63 void GetBHOFriction(IssmDouble* B,Element* element, IssmDouble* xyz_list,Gauss* gauss);61 void GetBHO(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss); 62 void GetBHOprime(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss); 63 void GetBHOFriction(IssmDouble* B,Element* element,int dim,IssmDouble* xyz_list,Gauss* gauss); 64 64 void InputUpdateFromSolutionHO(IssmDouble* solution,Element* element); 65 65 /*FS*/ -
issm/trunk-jpl/src/c/classes/Elements/Element.cpp
r17100 r17242 378 378 *pviscosity = viscosity; 379 379 }/*}}}*/ 380 void Element::ViscosityHO(IssmDouble* pviscosity, IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input){/*{{{*/380 void Element::ViscosityHO(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input){/*{{{*/ 381 381 382 382 /*Intermediaries*/ 383 383 IssmDouble viscosity; 384 IssmDouble epsilon[5];/* epsilon=[exx,eyy,exy,exz,eyz];*/ 385 386 this->StrainRateHO(&epsilon[0],xyz_list,gauss,vx_input,vy_input); 387 material->GetViscosity3d(&viscosity, &epsilon[0]); 384 IssmDouble epsilon3d[5];/* epsilon=[exx,eyy,exy,exz,eyz];*/ 385 IssmDouble epsilon2d[2]; /* epsilon=[exx,exy]; */ 386 387 if(dim==3){ 388 this->StrainRateHO(&epsilon3d[0],xyz_list,gauss,vx_input,vy_input); 389 material->GetViscosity3d(&viscosity, &epsilon3d[0]); 390 } 391 else{ 392 this->StrainRateHO2dvertical(&epsilon2d[0],xyz_list,gauss,vx_input,vy_input); 393 material->GetViscosity2dverticalHO(&viscosity, &epsilon2d[0]); 394 } 388 395 389 396 /*Assign output pointer*/ … … 469 476 470 477 }/*}}}*/ 478 void Element::StrainRateHO2dvertical(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input){/*{{{*/ 479 /*Compute the 2d Blatter/HOStrain Rate (2 components): 480 * 481 * epsilon=[exx exz] 482 * 483 * with exz=1/2 du/dz 484 * 485 * the contribution of vz is neglected 486 */ 487 488 /*Intermediaries*/ 489 IssmDouble dvx[3]; 490 491 /*Check that both inputs have been found*/ 492 if (!vx_input){ 493 _error_("Input missing. Here are the input pointers we have for vx: " << vx_input <<"\n"); 494 } 495 496 /*Get strain rate assuming that epsilon has been allocated*/ 497 vx_input->GetInputDerivativeValue(&dvx[0],xyz_list,gauss); 498 epsilon[0] = dvx[0]; 499 epsilon[1] = 0.5*dvx[1]; 500 501 }/*}}}*/ 471 502 void Element::StrainRateSSA(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input){/*{{{*/ 472 503 -
issm/trunk-jpl/src/c/classes/Elements/Element.h
r17236 r17242 70 70 void StrainRateSSA(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input); 71 71 void StrainRateHO(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input); 72 void StrainRateHO2dvertical(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input); 72 73 void StrainRateFS(IssmDouble* epsilon,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input); 73 74 IssmDouble TMeltingPoint(IssmDouble pressure); 74 75 void ViscousHeatingCreateInput(void); 75 76 void ViscosityFS(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* vz_input); 76 void ViscosityHO(IssmDouble* pviscosity, IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input);77 void ViscosityHO(IssmDouble* pviscosity,int dim,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input); 77 78 void ViscosityL1L2(IssmDouble* pviscosity,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input,Input* surf); 78 79 void ViscositySSA(IssmDouble* pviscosity,IssmDouble* xyz_list,Gauss* gauss,Input* vx_input,Input* vy_input); -
issm/trunk-jpl/src/c/classes/Elements/TriaRef.cpp
r17226 r17242 451 451 452 452 switch(finiteelement){ 453 case P0Enum: 454 /*Nodal function 1*/ 455 dbasis[NUMNODESP0*0+0] = 0.; 456 dbasis[NUMNODESP0*1+0] = 0.; 457 return; 453 458 case P1Enum: case P1DGEnum: 454 459 /*Nodal function 1*/ -
issm/trunk-jpl/src/c/classes/Materials/Material.h
r16638 r17242 28 28 virtual void GetViscosity2d(IssmDouble* pviscosity, IssmDouble* pepsilon)=0; 29 29 virtual void GetViscosity2dvertical(IssmDouble* pviscosity, IssmDouble* pepsilon)=0; 30 virtual void GetViscosity2dverticalHO(IssmDouble* pviscosity, IssmDouble* pepsilon)=0; 30 31 virtual void GetViscosity3d(IssmDouble* pviscosity3d, IssmDouble* pepsilon)=0; 31 32 virtual void GetViscosity3dFS(IssmDouble* pviscosity3d, IssmDouble* epsilon)=0; -
issm/trunk-jpl/src/c/classes/Materials/Matice.cpp
r17236 r17242 351 351 /*Build viscosity: viscosity=B/(2*A^e) */ 352 352 A=exx*exx+eyy*eyy+2.*exy*exy; 353 if(A==0.){ 354 /*Maxiviscositym viscosity for 0 shear areas: */ 355 viscosity=2.5*2.e+17; 356 } 357 else{ 358 e=(n-1.)/(2.*n); 359 viscosity=(1.-D)*B/(2.*pow(A,e)); 360 } 361 } 362 } 363 364 /*Checks in debugging mode*/ 365 if(viscosity<=0) _error_("Negative viscosity"); 366 _assert_(B>0); 367 _assert_(n>0); 368 _assert_(D>=0 && D<1); 369 370 /*Return: */ 371 *pviscosity=viscosity; 372 } 373 /*}}}*/ 374 /*FUNCTION Matice::GetViscosity2dverticalHO {{{*/ 375 void Matice::GetViscosity2dverticalHO(IssmDouble* pviscosity, IssmDouble* epsilon){ 376 /*From a string tensor and a material object, return viscosity, using Glen's flow law. 377 (1-D) B 378 viscosity= -------------------------------------- 379 2[ 2exx^2 + 2exy^2]^[(n-1)/2n] 380 381 where viscosity is the viscotiy, B the flow law parameter , (u,v) the velocity 382 vector, and n the flow law exponent. 383 384 If epsilon is NULL, it means this is the first time SystemMatrices is being run, and we 385 return 10^14, initial viscosity. 386 */ 387 388 /*output: */ 389 IssmDouble viscosity; 390 391 /*input strain rate: */ 392 IssmDouble exx,exy; 393 394 /*Intermediary: */ 395 IssmDouble A,e; 396 IssmDouble B,D,n; 397 398 /*Get B and n*/ 399 B=GetB(); 400 n=GetN(); 401 D=GetD(); 402 403 if (n==1){ 404 /*Viscous behaviour! viscosity=B: */ 405 viscosity=(1-D)*B/2; 406 } 407 else{ 408 if((epsilon[0]==0) && (epsilon[1]==0) && (epsilon[2]==0)){ 409 viscosity=0.5*pow(10.,14); 410 } 411 else{ 412 /*Retrive strain rate components: */ 413 exx=epsilon[0]; 414 exy=epsilon[1]; 415 416 /*Build viscosity: viscosity=B/(2*A^e) */ 417 A=2*exx*exx+2.*exy*exy; 353 418 if(A==0.){ 354 419 /*Maxiviscositym viscosity for 0 shear areas: */ -
issm/trunk-jpl/src/c/classes/Materials/Matice.h
r16783 r17242 54 54 void GetViscosity2d(IssmDouble* pviscosity, IssmDouble* pepsilon); 55 55 void GetViscosity2dvertical(IssmDouble* pviscosity, IssmDouble* pepsilon); 56 void GetViscosity2dverticalHO(IssmDouble* pviscosity, IssmDouble* pepsilon); 56 57 void GetViscosity3d(IssmDouble* pviscosity3d, IssmDouble* pepsilon); 57 58 void GetViscosity3dFS(IssmDouble* pviscosity3d, IssmDouble* epsilon); -
issm/trunk-jpl/src/c/classes/Materials/Matpar.h
r17021 r17242 84 84 void GetViscosity2d(IssmDouble* pviscosity, IssmDouble* pepsilon){_error_("not supported");}; 85 85 void GetViscosity2dvertical(IssmDouble* pviscosity, IssmDouble* pepsilon){_error_("not supported");}; 86 void GetViscosity2dverticalHO(IssmDouble* pviscosity, IssmDouble* pepsilon){_error_("not supported");}; 86 87 void GetViscosity3d(IssmDouble* pviscosity3d, IssmDouble* pepsilon){_error_("not supported");}; 87 88 void GetViscosity3dFS(IssmDouble* pviscosity3d, IssmDouble* epsilon){_error_("not supported");};
Note:
See TracChangeset
for help on using the changeset viewer.