Changeset 9002
- Timestamp:
- 07/15/11 08:49:34 (14 years ago)
- Location:
- issm/trunk/src
- Files:
-
- 13 added
- 32 edited
Legend:
- Unmodified
- Added
- Removed
-
issm/trunk/src/c/Container/DataSet.cpp
r8798 r9002 288 288 dataset->AddObject(spc);} 289 289 break; 290 case SpctEnum:{ 291 Spct* spct=NULL; 292 spct=new Spct(); 293 spct->Demarshall(&marshalled_dataset); 294 dataset->AddObject(spct);} 295 break; 296 290 297 case PengridEnum:{ 291 298 Pengrid* pengrid=NULL; -
issm/trunk/src/c/EnumDefinitions/EnumDefinitions.h
r8942 r9002 154 154 /*Spc: */ 155 155 SpcEnum, 156 SpctEnum, 156 157 /*}}}*/ 157 158 /*Geography {{{1*/ -
issm/trunk/src/c/Makefile.am
r8967 r9002 230 230 ./objects/Materials/Matpar.h\ 231 231 ./objects/Materials/Matpar.cpp\ 232 ./objects/Constraints/Constraint.h\ 232 233 ./objects/Constraints/Spc.cpp\ 233 234 ./objects/Constraints/Spc.h\ 235 ./objects/Constraints/Spct.cpp\ 236 ./objects/Constraints/Spct.h\ 234 237 ./objects/Loads/Penpair.cpp\ 235 238 ./objects/Loads/Penpair.h\ … … 566 569 ./modules/IoModelToInputsx/IoModelToInputsx.h\ 567 570 ./modules/IoModelToInputsx/IoModelToInputsx.cpp\ 571 ./modules/IoModelToConstraintsx/IoModelToConstraintsx.h\ 572 ./modules/IoModelToConstraintsx/IoModelToConstraintsx.cpp\ 568 573 ./modules/InputUpdateFromConstantx/InputUpdateFromConstantx.h\ 569 574 ./modules/InputUpdateFromConstantx/InputUpdateFromConstantx.cpp\ … … 596 601 ./modules/SpcNodesx/SpcNodesx.h\ 597 602 ./modules/SpcNodesx/SpcNodesx.cpp\ 603 ./modules/UpdateConstraintsx/UpdateConstraintsx.h\ 604 ./modules/UpdateConstraintsx/UpdateConstraintsx.cpp\ 598 605 ./modules/InterpFromGridToMeshx/InterpFromGridToMeshx.cpp\ 599 606 ./modules/InterpFromGridToMeshx/InterpFromGridToMeshx.h\ … … 909 916 ./objects/Materials/Matpar.h\ 910 917 ./objects/Materials/Matpar.cpp\ 918 ./objects/Constraints/Constraint.h\ 911 919 ./objects/Constraints/Spc.cpp\ 912 920 ./objects/Constraints/Spc.h\ 921 ./objects/Constraints/Spct.cpp\ 922 ./objects/Constraints/Spct.h\ 913 923 ./objects/Loads/Penpair.cpp\ 914 924 ./objects/Loads/Penpair.h\ … … 1238 1248 ./modules/IoModelToInputsx/IoModelToInputsx.h\ 1239 1249 ./modules/IoModelToInputsx/IoModelToInputsx.cpp\ 1250 ./modules/IoModelToConstraintsx/IoModelToConstraintsx.h\ 1251 ./modules/IoModelToConstraintsx/IoModelToConstraintsx.cpp\ 1240 1252 ./modules/InputUpdateFromConstantx/InputUpdateFromConstantx.h\ 1241 1253 ./modules/InputUpdateFromConstantx/InputUpdateFromConstantx.cpp\ … … 1268 1280 ./modules/SpcNodesx/SpcNodesx.h\ 1269 1281 ./modules/SpcNodesx/SpcNodesx.cpp\ 1282 ./modules/UpdateConstraintsx/UpdateConstraintsx.h\ 1283 ./modules/UpdateConstraintsx/UpdateConstraintsx.cpp\ 1270 1284 ./modules/InterpFromGridToMeshx/InterpFromGridToMeshx.cpp\ 1271 1285 ./modules/InterpFromGridToMeshx/InterpFromGridToMeshx.h\ -
issm/trunk/src/c/modules/EnumToStringx/EnumToStringx.cpp
r8942 r9002 130 130 case ExternalResultEnum : return "ExternalResult"; 131 131 case SpcEnum : return "Spc"; 132 case SpctEnum : return "Spct"; 132 133 case GeographyEnum : return "Geography"; 133 134 case IceSheetEnum : return "IceSheet"; -
issm/trunk/src/c/modules/ModelProcessorx/CreateParameters.cpp
r8926 r9002 73 73 parameters->AddObject(new BoolParam(IsprognosticEnum,iomodel->isprognostic)); 74 74 parameters->AddObject(new BoolParam(IsthermalEnum,iomodel->isthermal)); 75 parameters->AddObject(new DoubleParam(TimeEnum,0.0)); //start at time 0 by default for all solutions. 75 76 76 77 /*Deal with more complex parameters*/ -
issm/trunk/src/c/modules/ModelProcessorx/Thermal/CreateConstraintsThermal.cpp
r8926 r9002 4 4 5 5 #include "../../../Container/Container.h" 6 #include "../../../modules/modules.h" 6 7 #include "../../../io/io.h" 7 8 #include "../../../toolkits/toolkits.h" … … 19 20 /*Output*/ 20 21 Constraints* constraints = NULL; 21 Spc* spc = NULL;22 22 23 23 /*Recover pointer: */ … … 30 30 if (iomodel->dim==2) goto cleanup_and_return; 31 31 32 /*Fetch data: */ 33 IoModelFetchData(&iomodel->spctemperature,NULL,NULL,iomodel_handle,SpctemperatureEnum); 34 35 /*Initialize counter*/ 36 count=0; 37 38 /*Create spcs from x,y,z, as well as the spc values on those spcs: */ 39 for (i=0;i<iomodel->numberofvertices;i++){ 40 /*keep only this partition's nodes:*/ 41 if((iomodel->my_vertices[i])){ 42 43 if ((int)iomodel->spctemperature[2*i]){ 44 45 constraints->AddObject(new Spc(iomodel->constraintcounter+count+1,iomodel->nodecounter+i+1,1,iomodel->spctemperature[2*i+1],ThermalAnalysisEnum)); 46 count++; 47 48 } 49 50 } //if((my_nodes[i]==1)) 51 } 52 53 /*Free data: */ 54 xfree((void**)&iomodel->spctemperature); 32 /*Create constraints: */ 33 IoModelToConstraintsx(constraints,iomodel,iomodel_handle,SpctemperatureEnum,ThermalAnalysisEnum); 55 34 56 35 cleanup_and_return: 57 36 58 37 /*Assign output pointer: */ 59 38 *pconstraints=constraints; -
issm/trunk/src/c/modules/ModelProcessorx/Thermal/CreateLoadsThermal.cpp
r8926 r9002 39 39 if((iomodel->my_vertices[i]==1)){ 40 40 41 if ( !iomodel->spctemperature[2*i]){ //No penalty applied on spc nodes!41 if (isnan(iomodel->spctemperature[i])){ //No penalty applied on spc nodes! 42 42 43 43 loads->AddObject(new Pengrid(iomodel->loadcounter+i+1,i,iomodel,ThermalAnalysisEnum)); -
issm/trunk/src/c/modules/SpcNodesx/SpcNodesx.cpp
r8303 r9002 10 10 #include "../../EnumDefinitions/EnumDefinitions.h" 11 11 12 void SpcNodesx(Nodes* nodes,Constraints* constraints, int analysis_type){12 void SpcNodesx(Nodes* nodes,Constraints* constraints,Parameters* parameters, int analysis_type){ 13 13 14 14 int i; 15 Node* node=NULL;16 int nodeid;17 int dof;18 double value;15 16 for(i=0;i<constraints->Size();i++){ 17 18 Constraint* constraint=(Constraint*)constraints->GetObjectByOffset(i); 19 19 20 for(i=0;i<constraints->Size();i++){ 20 /*Check this constraint belongs to this analysis: */ 21 if(constraint->InAnalysis(analysis_type)){ 21 22 22 Object* object=(Object*)constraints->GetObjectByOffset(i); 23 24 /*Check constraints is a single point constraint (spc): */ 25 if(object->Enum()==SpcEnum){ 26 27 Spc* spc=(Spc*)object; 28 29 if(spc->InAnalysis(analysis_type)){ 30 31 /*Ok, constraints object is a constraint. Get the nodeid from the node it applies to: */ 32 nodeid=spc->GetNodeId(); 33 dof=spc->GetDof(); 34 value=spc->GetValue(); 35 36 /*Now, chase through nodes and find the corect node: */ 37 node=(Node*)nodes->GetObjectById(NULL,nodeid); 38 39 /*Apply constraint: */ 40 if(node){ //in case the spc is dealing with a node on another cpu 41 node->ApplyConstraint(dof,value); 42 } 43 } 44 23 /*Ok, apply constraint onto corresponding node: */ 24 constraint->ConstrainNode(nodes,parameters); 45 25 } 46 26 } -
issm/trunk/src/c/modules/SpcNodesx/SpcNodesx.h
r5772 r9002 11 11 12 12 /* local prototypes: */ 13 void SpcNodesx(Nodes* nodes in,Constraints* constraints,int analysis_type);13 void SpcNodesx(Nodes* nodes, Constraints* constraints,Parameters* parameters,int analysis_type); 14 14 15 15 #endif /* _SPCNODESX_H */ -
issm/trunk/src/c/modules/StringToEnumx/StringToEnumx.cpp
r8942 r9002 128 128 else if (strcmp(name,"ExternalResult")==0) return ExternalResultEnum; 129 129 else if (strcmp(name,"Spc")==0) return SpcEnum; 130 else if (strcmp(name,"Spct")==0) return SpctEnum; 130 131 else if (strcmp(name,"Geography")==0) return GeographyEnum; 131 132 else if (strcmp(name,"IceSheet")==0) return IceSheetEnum; -
issm/trunk/src/c/modules/modules.h
r8967 r9002 50 50 #include "./InputArtificialNoisex/InputArtificialNoisex.h" 51 51 #include "./IoModelToInputsx/IoModelToInputsx.h" 52 #include "./IoModelToConstraintsx/IoModelToConstraintsx.h" 52 53 #include "./KMLMeshWritex/KMLFileReadx.h" 53 54 #include "./KMLMeshWritex/KMLMeshWritex.h" … … 95 96 #include "./Solverx/Solverx.h" 96 97 #include "./SpcNodesx/SpcNodesx.h" 98 #include "./UpdateConstraintsx/UpdateConstraintsx.h" 97 99 #include "./SurfaceAreax/SurfaceAreax.h" 98 100 #include "./SystemMatricesx/SystemMatricesx.h" -
issm/trunk/src/c/objects/Constraints/Spc.cpp
r8224 r9002 147 147 /*}}}1*/ 148 148 149 /*Constraint virtual functions definitions: */ 150 /*FUNCTION Spc::InAnalysis{{{1*/ 151 bool Spc::InAnalysis(int in_analysis_type){ 152 if (in_analysis_type==this->analysis_type) return true; 153 else return false; 154 } 155 /*}}}*/ 156 /*FUNCTION Spc::ConstrainNode{{{1*/ 157 void Spc::ConstrainNode(Nodes* nodes,Parameters* parameters){ 158 159 Node* node=NULL; 160 161 /*Chase through nodes and find the node to which this Spc applys: */ 162 node=(Node*)nodes->GetObjectById(NULL,nodeid); 163 164 /*Apply constraint: */ 165 if(node){ //in case the spc is dealing with a node on another cpu 166 node->ApplyConstraint(dof,value); 167 } 168 } 169 /*}}}*/ 170 149 171 /*Spc functions*/ 150 172 /*FUNCTION Spc::GetDof {{{1*/ … … 164 186 } 165 187 /*}}}1*/ 166 /*FUNCTION Spc::InAnalysis{{{1*/167 bool Spc::InAnalysis(int in_analysis_type){168 if (in_analysis_type==this->analysis_type) return true;169 else return false;170 }171 /*}}}*/ -
issm/trunk/src/c/objects/Constraints/Spc.h
r4248 r9002 12 12 /*}}}*/ 13 13 14 class Spc: public Object{14 class Spc: public Constraint{ 15 15 16 16 private: … … 39 39 Object* copy(); 40 40 /*}}}*/ 41 /*Constraint virtual functions definitions: {{{1*/ 42 void ConstrainNode(Nodes* nodes,Parameters* parameters); 43 bool InAnalysis(int analysis_type); 44 /*}}}*/ 41 45 /*Spc management:{{{1 */ 42 46 int GetNodeId(); 43 47 int GetDof(); 44 48 double GetValue(); 45 bool InAnalysis(int analysis_type);46 49 /*}}}*/ 47 50 -
issm/trunk/src/c/objects/FemModel.cpp
r8926 r9002 59 59 60 60 _printf_(VerboseMProcessor()," resolve node constraints\n"); 61 SpcNodesx(nodes,constraints, analysis_type);62 61 SpcNodesx(nodes,constraints,parameters,analysis_type); 62 63 63 _printf_(VerboseMProcessor()," create nodal degrees of freedom\n"); 64 64 NodesDofx(nodes,parameters,analysis_type); -
issm/trunk/src/c/objects/Loads/Load.h
r8800 r9002 23 23 24 24 virtual ~Load(){}; 25 25 26 /*Virtual functions: {{{1*/ 26 27 virtual void Configure(Elements* elements,Loads* loads,Nodes* nodes,Vertices* vertices,Materials* materials,Parameters* parameters)=0; -
issm/trunk/src/c/objects/Node.cpp
r8827 r9002 529 529 } 530 530 /*}}}*/ 531 /*FUNCTION Node::RelaxConstraint{{{1*/ 532 void Node::RelaxConstraint(int dof){ 533 534 /*Dof should be added to the f-set, and taken out of the s-set:*/ 535 DofInFSet(dof-1); 536 this->indexing.svalues[dof-1]=NAN; 537 } 538 /*}}}*/ 531 539 /*FUNCTION Node::CreateVecSets {{{1*/ 532 540 void Node::CreateVecSets(Vec pv_g,Vec pv_f,Vec pv_s){ … … 593 601 } 594 602 /*}}}*/ 603 /*FUNCTION Node::DofInFSet {{{1*/ 604 void Node::DofInFSet(int dof){ 605 606 /*Put dof for this node into the f set (ie, this dof will NOT be constrained 607 * to a fixed value during computations. */ 608 609 this->indexing.f_set[dof]=1; 610 this->indexing.s_set[dof]=0; 611 } 612 /*}}}*/ 595 613 /*FUNCTION Node::FreezeDof{{{1*/ 596 614 void Node::FreezeDof(int dof){ -
issm/trunk/src/c/objects/Node.h
r8800 r9002 75 75 int IsClone(); 76 76 void ApplyConstraint(int dof,double value); 77 void RelaxConstraint(int dof); 77 78 void DofInSSet(int dof); 79 void DofInFSet(int dof); 78 80 int GetDof(int dofindex,int setenum); 79 81 void CreateVecSets(Vec pv_g,Vec pv_f,Vec pv_s); -
issm/trunk/src/c/objects/objects.h
r8800 r9002 20 20 21 21 /*Constraints: */ 22 #include "./Constraints/Constraint.h" 22 23 #include "./Constraints/Spc.h" 24 #include "./Constraints/Spct.h" 23 25 24 26 /*Gauss*/ -
issm/trunk/src/c/shared/Numerics/UnitConversion.cpp
r8967 r9002 47 47 double scale; 48 48 switch(type_enum){ 49 case TimeEnum: scale=1.0/yts;break; //yr 49 50 case VxEnum: scale=yts;break; //m/yr 50 51 case VxObsEnum: scale=yts;break; //m/yr -
issm/trunk/src/c/solutions/thermal_core.cpp
r8392 r9002 43 43 if(nsteps)_printf_(VerboseSolution(),"time step: %i/%i\n",i+1,nsteps); 44 44 time=(i+1)*dt; 45 femmodel->parameters->SetParam(time,TimeEnum); 45 46 46 47 /*call thermal_core_step: */ -
issm/trunk/src/c/solvers/solver_thermal_nonlinear.cpp
r8815 r9002 48 48 InputUpdateFromConstantx( femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters,reset_penalties,ResetPenaltiesEnum); 49 49 InputUpdateFromConstantx( femmodel->elements,femmodel->nodes, femmodel->vertices, femmodel->loads, femmodel->materials, femmodel->parameters,false,ConvergedEnum); 50 51 UpdateConstraintsx(femmodel->nodes,femmodel->constraints,femmodel->parameters); 52 50 53 for(;;){ 51 54 -
issm/trunk/src/m/model/extrude.m
r8823 r9002 136 136 137 137 %drag_coefficient is limited to nodes that are on the bedrock. 138 md.drag_coefficient=project3d(md, md.drag_coefficient,'node',1);138 md.drag_coefficient=project3d(md,'vector',md.drag_coefficient,'type','node','layer',1); 139 139 140 140 %p and q (same deal, except for element that are on the bedrock: ) 141 md.drag_p=project3d(md, md.drag_p,'element');142 md.drag_q=project3d(md, md.drag_q,'element');141 md.drag_p=project3d(md,'vector',md.drag_p,'type','element'); 142 md.drag_q=project3d(md,'vector',md.drag_q,'type','element'); 143 143 144 144 %observations 145 md.vx_obs=project3d(md,md.vx_obs,'node'); 146 md.vy_obs=project3d(md,md.vy_obs,'node'); 147 md.vel_obs=project3d(md,md.vel_obs,'node'); 148 md.vx_bal=project3d(md,md.vx_bal,'node'); 149 md.vy_bal=project3d(md,md.vy_bal,'node'); 150 md.vel_bal=project3d(md,md.vel_bal,'node'); 151 md.vel_obs_raw=project3d(md,md.vel_obs_raw,'node'); 152 md.surface_mass_balance=project3d(md,md.surface_mass_balance,'node'); 153 md.surface_accumulation_rate=project3d(md,md.surface_accumulation_rate,'node'); 154 md.surface_ablation_rate=project3d(md,md.surface_ablation_rate,'node'); 155 md.dhdt=project3d(md,md.dhdt,'node'); 156 md.firn_layer=project3d(md,md.firn_layer,'node',md.numlayers); 157 if ~isempty(md.forcings), 158 forcingnames=fieldnames(md.forcings); 159 numforcings=length(fieldnames(md.forcings)); 160 for i=1:numforcings 161 forcing=md.forcings.(forcingnames{i}); 162 md.forcings.(forcingnames{i})=[project3d(md,forcing(1:end-1,:),'node');forcing(end,:)]; 163 end 164 end 145 md.vx_obs=project3d(md,'vector',md.vx_obs,'type','node'); 146 md.vy_obs=project3d(md,'vector',md.vy_obs,'type','node'); 147 md.vel_obs=project3d(md,'vector',md.vel_obs,'type','node'); 148 md.vx_bal=project3d(md,'vector',md.vx_bal,'type','node'); 149 md.vy_bal=project3d(md,'vector',md.vy_bal,'type','node'); 150 md.vel_bal=project3d(md,'vector',md.vel_bal,'type','node'); 151 md.vel_obs_raw=project3d(md,'vector',md.vel_obs_raw,'type','node'); 152 md.surface_mass_balance=project3d(md,'vector',md.surface_mass_balance,'type','node'); 153 md.surface_accumulation_rate=project3d(md,'vector',md.surface_accumulation_rate,'type','node'); 154 md.surface_ablation_rate=project3d(md,'vector',md.surface_ablation_rate,'type','node'); 155 md.dhdt=project3d(md,'vector',md.dhdt,'type','node'); 156 md.firn_layer=project3d(md,'vector',md.firn_layer,'type','node','layer',md.numlayers); 165 157 166 158 %results 167 if ~isnan(md.vx),md.vx=project3d(md, md.vx,'node');end;168 if ~isnan(md.vy),md.vy=project3d(md, md.vy,'node');end;169 if ~isnan(md.vz),md.vz=project3d(md, md.vz,'node');end;170 if ~isnan(md.vel),md.vel=project3d(md, md.vel,'node');end;171 if ~isnan(md.temperature),md.temperature=project3d(md, md.temperature,'node');end;172 if ~isnan(md.waterfraction),md.waterfraction=project3d(md, md.waterfraction,'node');end;173 if ~isnan(md.surface_slopex),md.surface_slopex=project3d(md, md.surface_slopex,'node');end;174 if ~isnan(md.surface_slopey),md.surface_slopey=project3d(md, md.surface_slopey,'node');end;175 if ~isnan(md.bed_slopex),md.bed_slopex=project3d(md, md.bed_slopex,'node');end;176 if ~isnan(md.bed_slopey),md.bed_slopey=project3d(md, md.bed_slopey,'node');end;159 if ~isnan(md.vx),md.vx=project3d(md,'vector',md.vx,'type','node');end; 160 if ~isnan(md.vy),md.vy=project3d(md,'vector',md.vy,'type','node');end; 161 if ~isnan(md.vz),md.vz=project3d(md,'vector',md.vz,'type','node');end; 162 if ~isnan(md.vel),md.vel=project3d(md,'vector',md.vel,'type','node');end; 163 if ~isnan(md.temperature),md.temperature=project3d(md,'vector',md.temperature,'type','node');end; 164 if ~isnan(md.waterfraction),md.waterfraction=project3d(md,'vector',md.waterfraction,'type','node');end; 165 if ~isnan(md.surface_slopex),md.surface_slopex=project3d(md,'vector',md.surface_slopex,'type','node');end; 166 if ~isnan(md.surface_slopey),md.surface_slopey=project3d(md,'vector',md.surface_slopey,'type','node');end; 167 if ~isnan(md.bed_slopex),md.bed_slopex=project3d(md,'vector',md.bed_slopex,'type','node');end; 168 if ~isnan(md.bed_slopey),md.bed_slopey=project3d(md,'vector',md.bed_slopey,'type','node');end; 177 169 178 170 %bedinfo and surface info 179 md.elementonbed=project3d(md, ones(md.numberofelements2d,1),'element',1);180 md.elementonsurface=project3d(md, ones(md.numberofelements2d,1),'element',md.numlayers-1);181 md.nodeonbed=project3d(md, ones(md.numberofnodes2d,1),'node',1);182 md.nodeonsurface=project3d(md, ones(md.numberofnodes2d,1),'node',md.numlayers);171 md.elementonbed=project3d(md,'vector',ones(md.numberofelements2d,1),'type','element','layer',1); 172 md.elementonsurface=project3d(md,'vector',ones(md.numberofelements2d,1),'type','element','layer',md.numlayers-1); 173 md.nodeonbed=project3d(md,'vector',ones(md.numberofnodes2d,1),'type','node','layer',1); 174 md.nodeonsurface=project3d(md,'vector',ones(md.numberofnodes2d,1),'type','node','layer',md.numlayers); 183 175 184 176 %elementstype … … 186 178 oldelements_type=md.elements_type2d; 187 179 md.elements_type=zeros(number_el3d,1); 188 md.elements_type=project3d(md, oldelements_type,'element');189 md.nodeonhutter=project3d(md, md.nodeonhutter,'node');190 md.nodeonmacayeal=project3d(md, md.nodeonmacayeal,'node');191 md.nodeonpattyn=project3d(md, md.nodeonpattyn,'node');192 md.nodeonstokes=project3d(md, md.nodeonstokes,'node');180 md.elements_type=project3d(md,'vector',oldelements_type,'type','element'); 181 md.nodeonhutter=project3d(md,'vector',md.nodeonhutter,'type','node'); 182 md.nodeonmacayeal=project3d(md,'vector',md.nodeonmacayeal,'type','node'); 183 md.nodeonpattyn=project3d(md,'vector',md.nodeonpattyn,'type','node'); 184 md.nodeonstokes=project3d(md,'vector',md.nodeonstokes,'type','node'); 193 185 end 194 186 … … 197 189 oldvertices_type=md.vertices_type2d; 198 190 md.vertices_type=zeros(number_nodes3d,1); 199 md.vertices_type=project3d(md, oldvertices_type,'node');191 md.vertices_type=project3d(md,'vector',oldvertices_type,'type','node'); 200 192 end 201 193 202 194 %boundary conditions 203 md.spcvx=project3d(md, md.spcvx,'node');204 md.spcvy=project3d(md, md.spcvy,'node');205 md.spcvz=project3d(md, md.spcvz,'node');206 md.spctemperature=project3d(md, md.spctemperature,'node',md.numlayers);207 md.spcthickness=project3d(md, md.spcthickness,'node');208 md.diagnostic_ref=project3d(md, md.diagnostic_ref,'node');195 md.spcvx=project3d(md,'vector',md.spcvx,'type','node'); 196 md.spcvy=project3d(md,'vector',md.spcvy,'type','node'); 197 md.spcvz=project3d(md,'vector',md.spcvz,'type','node'); 198 md.spctemperature=project3d(md,'vector',md.spctemperature,'type','node','layer',md.numlayers,'padding',NaN); 199 md.spcthickness=project3d(md,'vector',md.spcthickness,'type','node'); 200 md.diagnostic_ref=project3d(md,'vector',md.diagnostic_ref,'type','node'); 209 201 210 202 %in 3d, pressureload: [node1 node2 node3 node4 element] … … 226 218 227 219 %materials 228 md.rheology_B=project3d(md, md.rheology_B,'node');229 md.rheology_n=project3d(md, md.rheology_n,'element');220 md.rheology_B=project3d(md,'vector',md.rheology_B,'type','node'); 221 md.rheology_n=project3d(md,'vector',md.rheology_n,'type','element'); 230 222 231 223 %parameters 232 md.surface=project3d(md, md.surface,'node');233 md.thickness=project3d(md, md.thickness,'node');234 md.bed=project3d(md, md.bed,'node');235 md.nodeonboundary=project3d(md, md.nodeonboundary,'node');236 md.elementoniceshelf=project3d(md, md.elementoniceshelf,'element');237 md.nodeoniceshelf=project3d(md, md.nodeoniceshelf,'node');238 md.elementonicesheet=project3d(md, md.elementonicesheet,'element');239 md.nodeonicesheet=project3d(md, md.nodeonicesheet,'node');240 md.elementonwater=project3d(md, md.elementonwater,'element');241 md.nodeonwater=project3d(md, md.nodeonwater,'node');242 if ~isnan(md.weights),md.weights=project3d(md, md.weights,'node');end;224 md.surface=project3d(md,'vector',md.surface,'type','node'); 225 md.thickness=project3d(md,'vector',md.thickness,'type','node'); 226 md.bed=project3d(md,'vector',md.bed,'type','node'); 227 md.nodeonboundary=project3d(md,'vector',md.nodeonboundary,'type','node'); 228 md.elementoniceshelf=project3d(md,'vector',md.elementoniceshelf,'type','element'); 229 md.nodeoniceshelf=project3d(md,'vector',md.nodeoniceshelf,'type','node'); 230 md.elementonicesheet=project3d(md,'vector',md.elementonicesheet,'type','element'); 231 md.nodeonicesheet=project3d(md,'vector',md.nodeonicesheet,'type','node'); 232 md.elementonwater=project3d(md,'vector',md.elementonwater,'type','element'); 233 md.nodeonwater=project3d(md,'vector',md.nodeonwater,'type','node'); 234 if ~isnan(md.weights),md.weights=project3d(md,'vector',md.weights,'type','node');end; 243 235 244 236 %Put lithostatic pressure is there is an existing pressure … … 248 240 249 241 %special for thermal modeling: 250 md.basal_melting_rate=project3d(md, md.basal_melting_rate,'node',1);251 md.observed_temperature=project3d(md, md.observed_temperature,'node');242 md.basal_melting_rate=project3d(md,'vector',md.basal_melting_rate,'type','node','layer',1); 243 md.observed_temperature=project3d(md,'vector',md.observed_temperature,'type','node'); 252 244 if ~isnan(md.geothermalflux) 253 md.geothermalflux=project3d(md, md.geothermalflux,'node',1); %bedrock only gets geothermal flux245 md.geothermalflux=project3d(md,'vector',md.geothermalflux,'type','node','layer',1); %bedrock only gets geothermal flux 254 246 end 255 247 256 248 %mask: 257 md.mask=project3d(md, md.mask,'node');249 md.mask=project3d(md,'vector',md.mask,'type','node'); 258 250 259 251 %increase connectivity if less than 25: -
issm/trunk/src/m/model/ismodelselfconsistent.m
r9001 r9002 485 485 486 486 %CHECK THAT WE ARE NOT FULLY CONSTRAINED 487 if isnan(find(~md.spctemperature(:,1))),487 if ~any(~isnan(md.spctemperature)) 488 488 message(['model not consistent: model ' md.name ' is totally constrained for temperature, no need to solve!']); 489 489 end … … 507 507 508 508 %INITIAL TEMPERATURE 509 fields={'temperature',' spctemperature(:,2)','observed_temperature'};509 fields={'temperature','observed_temperature'}; 510 510 checkgreater(md,fields,0) 511 512 %CHECK SPCTEMPERATURE that are not NaN are >0. 513 if find(any(md.spctemperature(find(~isnan(md.spctemperature)))<=0)), 514 message(['model not consistent: model ' md.name ' is constrained with negative or nil temperatures!']); 515 end 516 511 517 end 512 518 %}}} -
issm/trunk/src/m/model/project3d.m
r8298 r9002 1 function projected_vector=project3d(md3d,v ector2d,type,varargin);1 function projected_vector=project3d(md3d,varargin); 2 2 %PROJECT3D - vertically project a vector from 2d mesh 3 3 % … … 5 5 % This vector can be a node vector of size (md3d.numberofnodes2d,N/A) or an 6 6 % element vector of size (md3d.numberofelements2d,N/A). 7 % type is 'element' or 'node'. layer an optional layer number where vector 8 % should keep its values. If not specified, all layers adopt the value of the 9 % 2d vector. 7 % arguments: 8 % 'vector': 2d vector 9 % 'type': 'element' or 'node'. 10 % options: 11 % 'layer' a layer number where vector should keep its values. If not specified, all layers adopt the 12 % value of the 2d vector. 13 % 'padding': default to 0 (value adopted by other 3d layers not being projected0 10 14 % 11 % Usage: 12 % extruded_vector=project3d(md3d,vector2d,type,layer); 15 % Egs: 16 % extruded_vector=project3d(md3d,'vector',vector2d,'type','node','layer',1,'padding',NaN); 17 % extruded_vector=project3d(md3d,'vector',vector2d,'type','element','padding',0); 18 % extruded_vector=project3d(md3d,'vector',vector2d,'type','node'); 13 19 14 if nargin==4, 15 layer=varargin{1}; 16 if ((layer<1) || (layer>md3d.numlayers)), 17 error(['project3d error message: layer shoud be between 1 and ' num2str(md3d.numlayers)]); 18 end 19 else 20 layer=0; 20 21 if nargin==0, 22 Project3dUsage; 23 error(); 21 24 end 25 26 options=pairoptions(varargin{:}); 27 28 %retrieve parameters from options. 29 vector2d=getfieldvalue(options,'vector'); %mandatory 30 type=getfieldvalue(options,'type'); %mandatory 31 layer=getfieldvalue(options,'layer',0); %optional (do all layers otherwise) 32 paddingvalue=getfieldvalue(options,'padding',0); %0 by default 22 33 23 34 if strcmpi(type,'node'), 24 35 25 projected_vector= zeros(md3d.numberofnodes,size(vector2d,2));36 projected_vector=paddingvalue*ones(md3d.numberofnodes,size(vector2d,2)); 26 37 27 38 if layer==0, … … 32 43 projected_vector(((layer-1)*md3d.numberofnodes2d+1):(layer*md3d.numberofnodes2d),:)=vector2d; 33 44 end 34 else 45 elseif strcmpi(type,'element'), 35 46 36 projected_vector= zeros(md3d.numberofelements,size(vector2d,2));47 projected_vector=paddingvalue*ones(md3d.numberofelements,size(vector2d,2)); 37 48 38 49 if layer==0, … … 44 55 projected_vector( ((layer-1)*md3d.numberofelements2d+1):(layer*md3d.numberofelements2d),:)=vector2d; 45 56 end 57 else 58 error('project3d error message: unknown projection type'); 46 59 end 60 61 function Project3dUsage; 62 63 disp('function projected_vector=project3d(md3d,varargin);'); 64 disp('PROJECT3D - vertically project a vector from 2d mesh...'); 65 disp(''); 66 disp(' vertically project a vector from 2d mesh (split in noncoll and coll areas) into a 3d mesh.'); 67 disp(' This vector can be a node vector of size (md3d.numberofnodes2d,N/A) or an '); 68 disp(' element vector of size (md3d.numberofelements2d,N/A). '); 69 disp(' arguments: '); 70 disp(' ''vector'': 2d vector'); 71 disp(' ''type'': ''element'' or ''node''. '); 72 disp(' options: '); 73 disp(' ''layer'' a layer number where vector should keep its values. If not specified, all layers adopt the '); 74 disp(' value of the 2d vector.'); 75 disp(' ''padding'': default to 0 (value adopted by other 3d layers not being projected0'); 76 disp(''); 77 disp(' Egs:'); 78 disp(' extruded_vector=project3d(md3d,''vector'',vector2d,''type'',''node'',''layer'',1,''padding'',NaN);'); 79 disp(' extruded_vector=project3d(md3d,''vector'',vector2d,''type'',''element'',''padding'',0);'); 80 disp(' extruded_vector=project3d(md3d,''vector'',vector2d,''type'',''node'');'); -
issm/trunk/src/m/solutions/NewFemModel.m
r8803 r9002 37 37 38 38 issmprintf(VerboseMProcessor(),'%s',' resolve node constraints'); 39 [femmodel.nodes]=SpcNodes(femmodel.nodes,femmodel.constraints, analysis_type);39 [femmodel.nodes]=SpcNodes(femmodel.nodes,femmodel.constraints,femmodel.parameters,analysis_type); 40 40 41 41 issmprintf(VerboseMProcessor(),'%s',' create nodal degrees of freedom'); -
issm/trunk/src/m/solvers/solver_thermal_nonlinear.m
r8814 r9002 20 20 [femmodel.elements loads]=InputUpdateFromConstant(femmodel.elements,femmodel.nodes,femmodel.vertices,femmodel.loads,femmodel.materials,femmodel.parameters,0,ConvergedEnum); 21 21 [femmodel.elements femmodel.loads]=InputUpdateFromConstant(femmodel.elements,femmodel.nodes,femmodel.vertices,femmodel.loads,femmodel.materials,femmodel.parameters,1,ResetPenaltiesEnum); 22 23 %update constraints 24 [femmodel.nodes]=UpdateConstraints(femmodel.nodes,femmodel.constraints,femmodel.parameters); 22 25 23 26 while(~converged), -
issm/trunk/src/m/utils/BC/SetIceSheetBC.m
r8823 r9002 61 61 62 62 if (length(md.observed_temperature)==md.numberofnodes), 63 md.spctemperature=[md.nodeonsurface md.observed_temperature]; %impose observed temperature on surface 63 md.spctemperature=NaN*ones(md.numberofnodes,1); 64 pos=find(md.nodeonsurface); md.spctemperature(pos)=md.observed_temperature(pos); %impose observed temperature on surface 64 65 if (length(md.geothermalflux)~=md.numberofnodes), 65 66 md.geothermalflux=50*10^-3*ones(md.numberofnodes,1); %50 mW/m^2 -
issm/trunk/src/m/utils/BC/SetIceShelfBC.m
r8823 r9002 93 93 94 94 if (length(md.observed_temperature)==md.numberofnodes), 95 md.spctemperature=[md.nodeonsurface md.observed_temperature]; %impose observed temperature on surface 95 md.spctemperature=NaN*ones(md.numberofnodes,1); 96 pos=find(md.nodeonsurface); md.spctemperature(pos)=md.observed_temperature(pos); %impose observed temperature on surface 96 97 if (length(md.geothermalflux)~=md.numberofnodes), 97 98 md.geothermalflux=zeros(md.numberofnodes,1); -
issm/trunk/src/m/utils/BC/SetMarineIceSheetBC.m
r8823 r9002 104 104 105 105 if (length(md.observed_temperature)==md.numberofnodes), 106 md.spctemperature=[md.nodeonsurface md.observed_temperature]; %impose observed temperature on surface 106 md.spctemperature=NaN*ones(md.numberofnodes,1); 107 pos=find(md.nodeonsurface); md.spctemperature(pos)=md.observed_temperature(pos); %impose observed temperature on surface 107 108 if (length(md.geothermalflux)~=md.numberofnodes), 108 109 md.geothermalflux=zeros(md.numberofnodes,1); -
issm/trunk/src/mex/Makefile.am
r8801 r9002 69 69 SparseToVector\ 70 70 SpcNodes\ 71 UpdateConstraints\ 71 72 SurfaceArea\ 72 73 SystemMatrices\ … … 301 302 SpcNodes/SpcNodes.h 302 303 304 UpdateConstraints_SOURCES = UpdateConstraints/UpdateConstraints.cpp\ 305 UpdateConstraints/UpdateConstraints.h 306 303 307 SystemMatrices_SOURCES = SystemMatrices/SystemMatrices.cpp\ 304 308 SystemMatrices/SystemMatrices.h -
issm/trunk/src/mex/SpcNodes/SpcNodes.cpp
r8910 r9002 10 10 /*input datasets: */ 11 11 Nodes* nodes=NULL; 12 Parameters* parameters=NULL; 12 13 Constraints* constraints=NULL; 13 14 int analysis_type; … … 22 23 FetchMatlabData((DataSet**)&nodes,NODESIN); 23 24 FetchMatlabData((DataSet**)&constraints,CONSTRAINTS); 25 FetchMatlabData(¶meters,PARAMETERS); 24 26 FetchMatlabData(&analysis_type,ANALYSISTYPE); 25 27 26 28 /*!Generate internal degree of freedom numbers: */ 27 SpcNodesx(nodes,constraints, analysis_type);29 SpcNodesx(nodes,constraints,parameters,analysis_type); 28 30 29 31 /*write output datasets: */ … … 33 35 delete nodes; 34 36 delete constraints; 37 delete parameters; 35 38 36 39 /*end module: */ … … 41 44 { 42 45 _printf_(true,"\n"); 43 _printf_(true," usage: [m.node]=%s(m.nodes,m.constraints );\n",__FUNCT__);46 _printf_(true," usage: [m.node]=%s(m.nodes,m.constraints,m.parameters);\n",__FUNCT__); 44 47 _printf_(true,"\n"); 45 48 } -
issm/trunk/src/mex/SpcNodes/SpcNodes.h
r5778 r9002 21 21 #define NODESIN (mxArray*)prhs[0] 22 22 #define CONSTRAINTS (mxArray*)prhs[1] 23 #define ANALYSISTYPE (mxArray*)prhs[2] 23 #define PARAMETERS (mxArray*)prhs[2] 24 #define ANALYSISTYPE (mxArray*)prhs[3] 24 25 25 26 /* serial output macros: */ … … 30 31 #define NLHS 1 31 32 #undef NRHS 32 #define NRHS 333 #define NRHS 4 33 34 34 35
Note:
See TracChangeset
for help on using the changeset viewer.