source: issm/trunk/src/c/objects/FemModel.cpp@ 6020

Last change on this file since 6020 was 6020, checked in by Eric.Larour, 14 years ago

Fixed bug with Double instead of DoubleVec Param being load for the analyses.
Some other quick fixes.

File size: 5.7 KB
Line 
1/*!\file FemModel.c
2 * \brief: implementation of the FemModel object
3 */
4
5
6#ifdef HAVE_CONFIG_H
7 #include "config.h"
8#else
9#error "Cannot compile with HAVE_CONFIG_H symbol! run configure first!"
10#endif
11
12#include "stdio.h"
13#include "../Container/Container.h"
14#include "../modules/ModelProcessorx/ModelProcessorx.h"
15#include "./objects.h"
16#include "../include/include.h"
17#include "../EnumDefinitions/EnumDefinitions.h"
18#include "../modules/modules.h"
19
20/*Object constructors and destructor*/
21/*FUNCTION FemModel::constructor {{{1*/
22FemModel::FemModel(ConstDataHandle IOMODEL,const int in_solution_type,const int* analyses,const int nummodels){
23
24 /*intermediary*/
25 int i;
26 IoModel* iomodel=NULL;
27 int analysis_type;
28
29 /*Initialize internal data: */
30 this->nummodels=nummodels;
31 this->solution_type=in_solution_type;
32 this->analysis_counter=nummodels-1; //point to last analysis_type carried out.
33 this->results=new DataSet(); //not initialized by CreateDataSets
34 this->partition=NULL;
35 this->tpartition=NULL;
36
37 /*Dynamically allocate whatever is a list of length nummodels: */
38 analysis_type_list=(int*)xmalloc(nummodels*sizeof(int));
39 m_nodesets=(NodeSets**)xmalloc(nummodels*sizeof(NodeSets*));
40 m_ys=(Vec*)xmalloc(nummodels*sizeof(Vec));
41
42 /*Initialize: */
43 for(i=0;i<nummodels;i++)analysis_type_list[i]=analyses[i];
44 for(i=0;i<nummodels;i++)m_nodesets[i]=NULL;
45 for(i=0;i<nummodels;i++)m_ys[i]=NULL;
46
47 /*create datasets for all analyses: */
48 ModelProcessorx(&this->elements,&this->nodes,&this->vertices,&this->materials,&this->constraints,&this->loads,&this->parameters,IOMODEL,this->solution_type,nummodels,analyses);
49
50 /*do the post-processing of the datasets to get an FemModel that can actually run analyses: */
51 for(i=0;i<nummodels;i++){
52
53 _printf_(" processing finite element model of analysis %s:\n",EnumToString(analysis_type_list[i]));
54 analysis_type=analysis_type_list[i];
55 this->SetCurrentConfiguration(analysis_type);
56
57 _printf_(" create vertex degrees of freedom\n");
58 VerticesDofx(&partition,&tpartition,vertices,parameters);
59
60 _printf_(" resolve node constraints\n");
61 SpcNodesx(nodes,constraints,analysis_type);
62
63 _printf_(" create nodal degrees of freedom\n");
64 NodesDofx(nodes,parameters,analysis_type);
65
66 _printf_(" create nodal constraints vector\n");
67 CreateNodalConstraintsx(&m_ys[i],nodes,analysis_type);
68
69 _printf_(" create node sets\n");
70 BuildNodeSetsx(&m_nodesets[i], nodes,analysis_type);
71
72 _printf_(" configuring element and loads\n");
73 ConfigureObjectsx(elements, loads, nodes, vertices, materials,parameters);
74 }
75}
76/*}}}1*/
77/*FUNCTION FemModel::destructor {{{1*/
78FemModel::~FemModel(){
79
80 /*Intermediary*/
81 int i;
82
83 /*Delete all the datasets: */
84 xfree((void**)&analysis_type_list);
85 delete elements;
86 delete nodes;
87 delete vertices;
88 delete constraints;
89 delete loads;
90 delete materials;
91 delete parameters;
92 delete results;
93 VecFree(&partition);
94 VecFree(&tpartition);
95
96 for(i=0;i<nummodels;i++){
97 NodeSets* temp_nodesets=m_nodesets[i];
98 delete temp_nodesets;
99 Vec temp_ys=m_ys[i];
100 VecFree(&temp_ys);
101 }
102
103 /*Delete dynamically allocated arrays: */
104 xfree((void**)&m_nodesets);
105 xfree((void**)&m_ys);
106
107}
108/*}}}1*/
109
110/*Object management*/
111/*FUNCTION FemModel::Echo {{{1*/
112void FemModel::Echo(void){
113
114 printf("FemModel echo: \n");
115 printf(" number of fem models: %i\n",nummodels);
116 printf(" analysis_type_list: \n");
117 for(int i=0;i<nummodels;i++)printf(" %i: %s\n",i,EnumToString(analysis_type_list[i]));
118 printf(" current analysis_type: \n");
119 printf(" %i: %s\n",analysis_counter,EnumToString(analysis_type_list[analysis_counter]));
120
121
122}
123/*}}}*/
124
125/*Numerics: */
126/*FUNCTION FemModel::SetCurrentConfiguration(int configuration_type,int analysis_type){{{1*/
127void FemModel::SetCurrentConfiguration(int configuration_type,int analysis_type){
128
129 int verbose=0;
130
131 /*retrieve parameters: */
132 this->parameters->FindParam(&verbose,VerboseEnum);
133
134 /*Use configuration_type to setup the analysis counter, the configurations of objects etc ... but use
135 * analysis_type to drive the element numerics. This allows for use of 1 configuration_type for several
136 * analyses. For example: do a SurfaceSlopeX, SurfaceSlopeY, BedSlopeX and BedSlopeY analysis using the
137 * Slope configuration.*/
138
139 int found=-1;
140 for(int i=0;i<nummodels;i++){
141 if (analysis_type_list[i]==configuration_type){
142 found=i;
143 break;
144 }
145 }
146 if(found!=-1) analysis_counter=found;
147 else ISSMERROR("Could not find alias for analysis_type %s in list of FemModel analyses",EnumToString(configuration_type));
148
149 /*activate matrices/vectors: */
150 nodesets=m_nodesets[analysis_counter];
151 ys=m_ys[analysis_counter];
152
153 /*Now, plug analysis_counter and analysis_type inside the parameters: */
154 this->parameters->SetParam(analysis_counter,AnalysisCounterEnum);
155 this->parameters->SetParam(analysis_type,AnalysisTypeEnum);
156 this->parameters->SetParam(configuration_type,ConfigurationTypeEnum);
157
158 /*configure elements, loads and nodes, for this new analysis: */
159 this->elements->SetCurrentConfiguration(elements,loads, nodes,vertices, materials,parameters);
160 this->nodes->SetCurrentConfiguration(elements,loads, nodes,vertices, materials,parameters);
161 this->loads->SetCurrentConfiguration(elements, loads, nodes,vertices, materials,parameters);
162
163 /*take care of petsc options, that depend on this analysis type: */
164 PetscOptionsFromAnalysis(this->parameters,analysis_type);
165
166 if(verbose){
167 _printf_(" Petsc Options set for analysis type: %s\n",EnumToString(analysis_type));
168 }
169
170
171}
172/*}}}1*/
173/*FUNCTION FemModel::SetCurrentConfiguration(int configuration_type){{{1*/
174void FemModel::SetCurrentConfiguration(int configuration_type){
175
176 /*overload: analysis_type = configuration_type: */
177 this->SetCurrentConfiguration(configuration_type,configuration_type);
178}
179/*}}}1*/
Note: See TracBrowser for help on using the repository browser.