Changeset 17426
- Timestamp:
- 03/12/14 15:55:03 (11 years ago)
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/ExtrapolationAnalysis.cpp
r17425 r17426 33 33 void ExtrapolationAnalysis::CreateNodes(Nodes* nodes,IoModel* iomodel){/*{{{*/ 34 34 int finiteelement=P1Enum; 35 if(iomodel->meshtype!=Mesh2DhorizontalEnum) iomodel->FetchData(2,MeshVertexonbedEnum,MeshVertexonsurfaceEnum); 35 36 ::CreateNodes(nodes,iomodel,ExtrapolationAnalysisEnum,finiteelement); 37 iomodel->DeleteData(2,MeshVertexonbedEnum,MeshVertexonsurfaceEnum); 36 38 } 37 39 /*}}}*/ … … 76 78 ElementMatrix* ExtrapolationAnalysis::CreateKMatrix(Element* element){/*{{{*/ 77 79 80 if(!element->IsOnBed()) return NULL; 81 Element* basalelement = element->SpawnBasalElement(); 82 78 83 /*Intermediaries */ 79 const int dim = 2;84 int meshtype,dim; 80 85 int i,row,col,stabilization; 81 86 bool extrapolatebydiffusion = true; 82 87 IssmDouble Jdet,D_scalar,h; 83 IssmDouble dlsf[dim],normal[dim];84 88 IssmDouble norm_dlsf; 85 89 IssmDouble hx,hy,hz,kappa; 86 90 IssmDouble* xyz_list = NULL; 87 91 92 /*Get problem dimension*/ 93 basalelement->FindParam(&meshtype,MeshTypeEnum); 94 switch(meshtype){ 95 case Mesh2DverticalEnum: dim = 1; break; 96 case Mesh2DhorizontalEnum: dim = 2; break; 97 case Mesh3DEnum: dim = 2; break; 98 default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet"); 99 } 100 88 101 /*Fetch number of nodes and dof for this finite element*/ 89 int numnodes = element->GetNumberOfNodes();102 int numnodes = basalelement->GetNumberOfNodes(); 90 103 91 104 /*Initialize Element vector and other vectors*/ 92 ElementMatrix* Ke = element->NewElementMatrix();105 ElementMatrix* Ke = basalelement->NewElementMatrix(); 93 106 IssmDouble* B = xNew<IssmDouble>(dim*numnodes); 94 107 IssmDouble* Bprime = xNew<IssmDouble>(dim*numnodes); 95 IssmDouble D[dim][dim]; 108 IssmDouble* dlsf = xNew<IssmDouble>(dim); 109 IssmDouble* normal = xNew<IssmDouble>(dim); 110 IssmDouble* D = xNew<IssmDouble>(dim*dim); 96 111 97 112 /*Retrieve all inputs and parameters*/ 98 Input* lsf_slopex_input= element->GetInput(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input);99 Input* lsf_slopey_input= element->GetInput(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input);100 element->GetVerticesCoordinates(&xyz_list);101 h = element->CharacteristicLength();113 Input* lsf_slopex_input=basalelement->GetInput(LevelsetfunctionSlopeXEnum); _assert_(lsf_slopex_input); 114 Input* lsf_slopey_input=basalelement->GetInput(LevelsetfunctionSlopeYEnum); _assert_(lsf_slopey_input); 115 basalelement->GetVerticesCoordinates(&xyz_list); 116 h = basalelement->CharacteristicLength(); 102 117 103 118 /* Start looping on the number of gaussian points: */ 104 Gauss* gauss= element->NewGauss(2);119 Gauss* gauss=basalelement->NewGauss(2); 105 120 for(int ig=gauss->begin();ig<gauss->end();ig++){/*{{{*/ 106 121 gauss->GaussPoint(ig); 107 122 108 element->JacobianDeterminant(&Jdet,xyz_list,gauss);109 GetB(B, element,xyz_list,gauss);110 GetBprime(Bprime, element,xyz_list,gauss);123 basalelement->JacobianDeterminant(&Jdet,xyz_list,gauss); 124 GetB(B,basalelement,xyz_list,gauss); 125 GetBprime(Bprime,basalelement,xyz_list,gauss); 111 126 112 127 D_scalar=gauss->weight*Jdet; … … 117 132 for(col=0;col<dim;col++) 118 133 if(row==col) 119 D[row ][col] = D_scalar;134 D[row*dim+col] = D_scalar; 120 135 else 121 D[row ][col] = 0.;136 D[row*dim+col] = 0.; 122 137 123 138 TripleMultiply(Bprime,dim,numnodes,1, 124 &D[0][0],dim,dim,0,139 D,dim,dim,0, 125 140 Bprime,dim,numnodes,0, 126 141 &Ke->values[0],1); … … 143 158 for(col=0;col<dim;col++) 144 159 if(row==col) 145 D[row ][col]=D_scalar*normal[row];160 D[row*dim+col] = D_scalar*normal[row]; 146 161 else 147 D[row ][col]=0.;162 D[row*dim+col] = 0.; 148 163 TripleMultiply(B,dim,numnodes,1, 149 &D[0][0],dim,dim,0,164 D,dim,dim,0, 150 165 Bprime,dim,numnodes,0, 151 166 &Ke->values[0],1); … … 156 171 else if(stabilization==1){ 157 172 /* Artificial Diffusion */ 158 element->ElementSizes(&hx,&hy,&hz);173 basalelement->ElementSizes(&hx,&hy,&hz); 159 174 h=sqrt( pow(hx*normal[0],2) + pow(hy*normal[1],2)); 160 175 kappa=h/2.+1.e-14; 161 D[0][0]=D_scalar*kappa; 162 D[0][1]=0.; 163 D[1][0]=0.; 164 D[1][1]=D_scalar*kappa; 176 for(row=0;row<dim;row++) 177 for(col=0;col<dim;col++) 178 if(row==col) 179 D[row*dim+col] = D_scalar*kappa; 180 else 181 D[row*dim+col] = 0.; 165 182 TripleMultiply(Bprime,dim,numnodes,1, 166 &D[0][0],dim,dim,0,183 D,dim,dim,0, 167 184 Bprime,dim,numnodes,0, 168 185 &Ke->values[0],1); … … 172 189 for(row=0;row<dim;row++) 173 190 for(col=0;col<dim;col++) 174 D[row ][col]=h/(2.*1.)*normal[row]*normal[col];191 D[row*dim+col]=h/(2.*1.)*normal[row]*normal[col]; 175 192 176 193 TripleMultiply(Bprime,dim,numnodes,1, 177 &D[0][0],dim,dim,0,194 D,dim,dim,0, 178 195 Bprime,dim,numnodes,0, 179 196 &Ke->values[0],1); … … 181 198 } 182 199 }/*}}}*/ 200 201 //TESTING 202 _printf_("in element: " << basalelement->Id() << "\n"); 203 Ke->Echo(); 183 204 184 205 /*Clean up and return*/ … … 186 207 xDelete<IssmDouble>(B); 187 208 xDelete<IssmDouble>(Bprime); 209 xDelete<IssmDouble>(dlsf); 210 xDelete<IssmDouble>(normal); 188 211 delete gauss; 189 212 return Ke; … … 191 214 }/*}}}*/ 192 215 ElementVector* ExtrapolationAnalysis::CreatePVector(Element* element){/*{{{*/ 216 217 if(!element->IsOnBed()) return NULL; 218 Element* basalelement = element->SpawnBasalElement(); 193 219 194 220 /*Intermediaries */ … … 196 222 197 223 /*Fetch number of nodes */ 198 int numnodes = element->GetNumberOfNodes();224 int numnodes = basalelement->GetNumberOfNodes(); 199 225 200 226 /*Initialize Element vector*/ 201 ElementVector* pe = element->NewElementVector();227 ElementVector* pe = basalelement->NewElementVector(); 202 228 for(i=0;i<numnodes;i++) 203 229 pe->values[i]=0.;
Note:
See TracChangeset
for help on using the changeset viewer.