Changeset 17114
- Timestamp:
- 01/14/14 17:42:52 (11 years ago)
- Location:
- issm/trunk-jpl/src
- Files:
-
- 12 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk-jpl/src/c/analyses/LevelsetAnalysis.cpp
r17098 r17114 59 59 /*Finite element Analysis*/ 60 60 void LevelsetAnalysis::Core(FemModel* femmodel){/*{{{*/ 61 _error_("not implemented yet"); 61 62 /*parameters: */ 63 bool save_results; 64 65 /*activate formulation: */ 66 femmodel->SetCurrentConfiguration(LevelsetAnalysisEnum); 67 68 /*recover parameters: */ 69 femmodel->parameters->FindParam(&save_results,SaveResultsEnum); 70 71 if(VerboseSolution()) _printf0_("call computational core:\n"); 72 solutionsequence_linear(femmodel); 73 74 if(save_results){ 75 if(VerboseSolution()) _printf0_(" saving results\n"); 76 int outputs = MaskIceLevelsetEnum; 77 femmodel->RequestedOutputsx(&femmodel->results,&outputs,1); 78 } 62 79 }/*}}}*/ 63 80 ElementVector* LevelsetAnalysis::CreateDVector(Element* element){/*{{{*/ … … 70 87 }/*}}}*/ 71 88 ElementMatrix* LevelsetAnalysis::CreateKMatrix(Element* element){/*{{{*/ 89 72 90 /*Intermediaries */ 73 74 int dim = 2; // solve for LSF in horizontal plane only 91 int i,j,dim = 2; // solve for LSF in horizontal plane only 75 92 IssmDouble kappa; 76 93 IssmDouble Jdet, dt, D_scalar; 77 IssmDouble u,v,um,vm,ub,vb,vx,vy; 94 IssmDouble h,hx,hy,hz; 95 IssmDouble vel,vx,vy,bx,by; 78 96 IssmDouble* xyz_list = NULL; 79 97 … … 86 104 IssmDouble* B = xNew<IssmDouble>(dim*numnodes); 87 105 IssmDouble* Bprime = xNew<IssmDouble>(dim*numnodes); 88 IssmDouble D[dim][dim] ;106 IssmDouble D[dim][dim], K[dim][dim]; 89 107 90 108 /*Retrieve all inputs and parameters*/ … … 93 111 Input* vx_input = element->GetInput(VxEnum); _assert_(vx_input); 94 112 Input* vy_input = element->GetInput(VyEnum); _assert_(vy_input); 95 Input* vxm_input = element->GetInput(VxMeshEnum); _assert_(vxm_input);96 Input* vym_input = element->GetInput(VyMeshEnum); _assert_(vym_input);97 113 98 114 /* Start looping on the number of gaussian points: */ … … 117 133 GetB(B,element,xyz_list,gauss); 118 134 GetBprime(Bprime,element,xyz_list,gauss); 119 vx_input->GetInputValue(& u,gauss); vxm_input->GetInputValue(&um,gauss); vx=u-um;120 vy_input->GetInputValue(&v ,gauss); vym_input->GetInputValue(&vm,gauss); vy=v-vm;121 ub=0.; // horizontal mass change velocities (melt/refreeze/calving) FIXME: insert values from model here122 vb=0.;123 D[0][0]=D_scalar*(vx+ ub);135 vx_input->GetInputValue(&vx,gauss); // in 3D case, add mesh velocity 136 vy_input->GetInputValue(&vy,gauss); 137 bx=0.; // horizontal mass change velocities (melt/refreeze/calving) FIXME: insert values from model here 138 by=0.; 139 D[0][0]=D_scalar*(vx+bx); 124 140 D[0][1]=0.; 125 141 D[1][0]=0.; 126 D[1][1]=D_scalar*(vy+ vb);142 D[1][1]=D_scalar*(vy+by); 127 143 TripleMultiply(B,dim,numnodes,1, 128 144 &D[0][0],dim,dim,0, … … 130 146 &Ke->values[0],1); 131 147 132 /* Artificial Diffusion */ 133 kappa=0.; //FIXME: insert suitable value for kappa 134 GetBprime(Bprime,element,xyz_list,gauss); // recalculation of Bprime needed? 135 D[0][0]=D_scalar*kappa; 136 D[1][1]=D_scalar*kappa; 137 TripleMultiply(Bprime,dim,numnodes,1, 138 &D[0][0],dim,dim,0, 139 Bprime,dim,numnodes,0, 140 &Ke->values[0],1); 148 /* Stabilization */ 149 int stabilization=1; 150 switch(stabilization){ 151 case 0: 152 // no stabilization, do nothing 153 break; 154 case 1: 155 /* Artificial Diffusion */ 156 element->ElementSizes(&hx,&hy,&hz); 157 vel=sqrt(vx*vx + vy*vy ); 158 h=sqrt( pow(hx*vx/vel,2) + pow(hy*vy/vel,2) ); //FIXME: is this correct? 159 160 kappa=h*vel/2.; //FIXME: insert suitable value for kappa 161 //GetBprime(Bprime,element,xyz_list,gauss); // recalculation of Bprime needed? 162 D[0][0]=D_scalar*kappa; 163 D[0][1]=0.; 164 D[1][0]=0.; 165 D[1][1]=D_scalar*kappa; 166 TripleMultiply(Bprime,dim,numnodes,1, 167 &D[0][0],dim,dim,0, 168 Bprime,dim,numnodes,0, 169 &Ke->values[0],1); 170 break; 171 case 2: 172 /* Streamline Upwinding */ 173 element->ElementSizes(&hx,&hy,&hz); 174 vel=sqrt(vx*vx + vy*vy )+1.e-14; 175 h=sqrt( pow(hx*vx/vel,2) + pow(hy*vy/vel,2) ); 176 K[0][0]=h/(2.*vel)*vx*vx; K[0][1]=h/(2.*vel)*vx*vy; 177 K[1][0]=h/(2.*vel)*vy*vx; K[1][1]=h/(2.*vel)*vy*vy; 178 for(i=0;i<dim;i++) for(j=0;j<dim;j++) K[i][j] = D_scalar*K[i][j]; 179 180 //GetBprime(Bprime,element,xyz_list,gauss); 181 TripleMultiply(Bprime,dim,numnodes,1, 182 &K[0][0],dim,dim,0, 183 Bprime,dim,numnodes,0, 184 &Ke->values[0],1); 185 break; 186 default: 187 _error_("unknown type of stabilization in LevelsetAnalysis.cpp"); 188 } 141 189 } 142 190 … … 161 209 162 210 /*Initialize Element vector*/ 163 ElementVector* pe 211 ElementVector* pe = element->NewElementVector(); 164 212 element->FindParam(&dt,TimesteppingTimeStepEnum); 165 213 … … 188 236 delete gauss; 189 237 } 190 else{for(i=0;i<numnodes;i++) pe->values[i]=0.;} 238 else 239 for(i=0;i<numnodes;i++) 240 pe->values[i]=0.; 191 241 return pe; 192 242 }/*}}}*/ … … 195 245 }/*}}}*/ 196 246 void LevelsetAnalysis::InputUpdateFromSolution(IssmDouble* solution,Element* element){/*{{{*/ 197 _error_("not implemented yet"); 247 248 int meshtype; 249 element->FindParam(&meshtype,MeshTypeEnum); 250 switch(meshtype){ 251 case Mesh2DhorizontalEnum: 252 element->InputUpdateFromSolutionOneDof(solution,MaskIceLevelsetEnum); 253 break; 254 case Mesh3DEnum: 255 element->InputUpdateFromSolutionOneDofCollapsed(solution,MaskIceLevelsetEnum); 256 break; 257 default: _error_("mesh "<<EnumToStringx(meshtype)<<" not supported yet"); 258 } 198 259 }/*}}}*/ 199 260 void LevelsetAnalysis::GetB(IssmDouble* B,Element* element,IssmDouble* xyz_list,Gauss* gauss){/*{{{*/ -
issm/trunk-jpl/src/c/classes/Elements/Element.h
r17109 r17114 146 146 virtual void GetNodesLidList(int* sidlist)=0; 147 147 148 virtual int Id()=0; 148 149 virtual int Sid()=0; 149 150 virtual bool IsNodeOnShelfFromFlags(IssmDouble* flags)=0; -
issm/trunk-jpl/src/c/classes/Elements/Tria.cpp
r17047 r17114 381 381 /*clean-up*/ 382 382 delete gauss; 383 } 384 /*}}}*/ 385 /*FUNCTION Tria::ElementSizes{{{*/ 386 void Tria::ElementSizes(IssmDouble* hx,IssmDouble* hy,IssmDouble* hz){ 387 388 IssmDouble xyz_list[NUMVERTICES][3]; 389 IssmDouble xmin,ymin; 390 IssmDouble xmax,ymax; 391 392 /*Get xyz list: */ 393 ::GetVerticesCoordinates(&xyz_list[0][0],vertices,NUMVERTICES); 394 xmin=xyz_list[0][0]; xmax=xyz_list[0][0]; 395 ymin=xyz_list[0][1]; ymax=xyz_list[0][1]; 396 397 for(int i=1;i<NUMVERTICES;i++){ 398 if(xyz_list[i][0]<xmin) xmin=xyz_list[i][0]; 399 if(xyz_list[i][0]>xmax) xmax=xyz_list[i][0]; 400 if(xyz_list[i][1]<ymin) ymin=xyz_list[i][1]; 401 if(xyz_list[i][1]>ymax) ymax=xyz_list[i][1]; 402 } 403 404 *hx=xmax-xmin; 405 *hy=ymax-ymin; 406 *hz=0.; 383 407 } 384 408 /*}}}*/ -
issm/trunk-jpl/src/c/classes/Elements/Tria.h
r17109 r17114 68 68 void SetwiseNodeConnectivity(int* d_nz,int* o_nz,Node* node,bool* flags,int* flagsindices,int set1_enum,int set2_enum); 69 69 void Delta18oParameterization(void); 70 void ElementSizes(IssmDouble* hx,IssmDouble* hy,IssmDouble* hz) {_error_("not implemented yet");};70 void ElementSizes(IssmDouble* hx,IssmDouble* hy,IssmDouble* hz); 71 71 void ThermalToEnthalpy(IssmDouble* penthalpy,IssmDouble temperature,IssmDouble waterfraction,IssmDouble pressure){_error_("not implemented yet");}; 72 72 void EnthalpyToThermal(IssmDouble* ptemperature,IssmDouble* pwaterfraction,IssmDouble enthalpy,IssmDouble pressure){_error_("not implemented yet");}; -
issm/trunk-jpl/src/c/cores/transient_core.cpp
r17078 r17114 50 50 femmodel->parameters->FindParam(&isgia,TransientIsgiaEnum); 51 51 femmodel->parameters->FindParam(&isgroundingline,TransientIsgroundinglineEnum); 52 femmodel->parameters->FindParam(&islevelset,TransientIslevelsetEnum); 52 53 femmodel->parameters->FindParam(&isFS,FlowequationIsFSEnum); 53 54 if(isgroundingline) femmodel->parameters->FindParam(&groundingline_migration,GroundinglineMigrationEnum); … … 161 162 if(islevelset){ 162 163 if(VerboseSolution()) _printf0_(" computing movement of ice boundaries\n"); 163 //analysis = new LevelsetAnalysis();164 //analysis->Core(femmodel);165 //delete analysis;164 analysis = new LevelsetAnalysis(); 165 analysis->Core(femmodel); 166 delete analysis; 166 167 } 167 168 -
issm/trunk-jpl/src/c/modules/ModelProcessorx/CreateParameters.cpp
r17100 r17114 68 68 parameters->AddObject(iomodel->CopyConstantObject(TransientIsgroundinglineEnum)); 69 69 parameters->AddObject(iomodel->CopyConstantObject(TransientIsgiaEnum)); 70 parameters->AddObject(iomodel->CopyConstantObject(TransientIslevelsetEnum)); 70 71 parameters->AddObject(iomodel->CopyConstantObject(MaterialsRheologyLawEnum)); 71 72 parameters->AddObject(iomodel->CopyConstantObject(AutodiffIsautodiffEnum)); -
issm/trunk-jpl/src/m/classes/mask.m
r16764 r17114 25 25 md = checkfield(md,'fieldname','mask.groundedice_levelset','size',[md.mesh.numberofvertices 1]); 26 26 md = checkfield(md,'fieldname','mask.ice_levelset' ,'size',[md.mesh.numberofvertices 1]); 27 isice=(md.mask.ice_levelset>0);28 if any(sum(isice(md.mesh.elements),2)==0),29 warning('elements with no ice not implemented yet, each element should have at least one vertex with md.mask.ice_levelset > 0');30 end27 %isice=(md.mask.ice_levelset>0); 28 %if any(sum(isice(md.mesh.elements),2)==0), 29 % warning('elements with no ice not implemented yet, each element should have at least one vertex with md.mask.ice_levelset > 0'); 30 % end 31 31 end % }}} 32 32 function disp(obj) % {{{ -
issm/trunk-jpl/src/m/classes/mask.py
r16764 r17114 33 33 34 34 md = checkfield(md,'fieldname','mask.ice_levelset' ,'size',[md.mesh.numberofvertices]) 35 isice=numpy.array(md.mask.ice_levelset>0,int)36 totallyicefree=(numpy.sum(isice[md.mesh.elements-1],axis=1)==0).astype(int)37 if any(totallyicefree):38 raise TypeError("elements with no ice not implemented yet, each element should have at least one vertex with md.mask.ice_levelset > 0")35 #isice=numpy.array(md.mask.ice_levelset<0,int) 36 #totallyicefree=(numpy.sum(isice[md.mesh.elements-1],axis=1)==0).astype(int) 37 #if any(totallyicefree): 38 # raise TypeError("elements with no ice not implemented yet, each element should have at least one vertex with md.mask.ice_levelset > 0") 39 39 40 40 return md -
issm/trunk-jpl/src/m/classes/transient.m
r17079 r17114 39 39 end % }}} 40 40 function list = defaultoutputs(self,md) % {{{ 41 42 list = {'SurfaceforcingsMassBalance'}; 43 41 if(self.ismasstransport) 42 list = {'SurfaceforcingsMassBalance'}; 43 else 44 list = {}; 45 end 44 46 end % }}} 45 47 function md = checkconsistency(obj,md,solution,analyses) % {{{ -
issm/trunk-jpl/src/m/classes/transient.py
r17079 r17114 38 38 def defaultoutputs(self,md): # {{{ 39 39 40 return ['SurfaceforcingsMassBalance'] 40 if self.ismasstransport: 41 return ['SurfaceforcingsMassBalance'] 42 else: 43 return [] 41 44 42 45 #}}} -
issm/trunk-jpl/src/m/parameterization/setmask.m
r15987 r17114 42 42 43 43 %level sets 44 md.mask.ice_levelset= ones(md.mesh.numberofvertices,1);44 md.mask.ice_levelset=-1.*ones(md.mesh.numberofvertices,1); 45 45 md.mask.groundedice_levelset=vertexongroundedice; 46 46 md.mask.groundedice_levelset(find(vertexongroundedice==0.))=-1.; -
issm/trunk-jpl/src/m/parameterization/setmask.py
r15987 r17114 42 42 43 43 #level sets 44 md.mask.ice_levelset = numpy.ones(md.mesh.numberofvertices,bool)44 md.mask.ice_levelset = -1.*numpy.ones((md.mesh.numberofvertices,1)) 45 45 md.mask.groundedice_levelset = -1.*numpy.ones((md.mesh.numberofvertices,1)) 46 46 md.mask.groundedice_levelset[md.mesh.elements[numpy.nonzero(elementongroundedice),:]-1]=1.
Note:
See TracChangeset
for help on using the changeset viewer.