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

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

Optimized configuration. Only needed in series, or in parallel when resetting
configuration in SetConfiguration in FemModel.
Still more to optimize, but this takes a lot of code away.

File size: 6.1 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_Rmg=(Mat*)xmalloc(nummodels*sizeof(Mat));
40 m_Gmn=(Mat*)xmalloc(nummodels*sizeof(Mat));
41 m_nodesets=(NodeSets**)xmalloc(nummodels*sizeof(NodeSets*));
42 m_yg=(Vec*)xmalloc(nummodels*sizeof(Vec));
43 m_ys=(Vec*)xmalloc(nummodels*sizeof(Vec));
44
45 /*Initialize: */
46 for(i=0;i<nummodels;i++)analysis_type_list[i]=analyses[i];
47 for(i=0;i<nummodels;i++)m_Rmg[i]=NULL;
48 for(i=0;i<nummodels;i++)m_Gmn[i]=NULL;
49 for(i=0;i<nummodels;i++)m_nodesets[i]=NULL;
50 for(i=0;i<nummodels;i++)m_yg[i]=NULL;
51 for(i=0;i<nummodels;i++)m_ys[i]=NULL;
52
53 /*create datasets for all analyses: */
54 ModelProcessorx(&this->elements,&this->nodes,&this->vertices,&this->materials,&this->constraints,&this->loads,&this->parameters,IOMODEL,this->solution_type,nummodels,analyses);
55
56 /*do the post-processing of the datasets to get an FemModel that can actually run analyses: */
57 for(i=0;i<nummodels;i++){
58
59 _printf_(" processing finite element model of analysis %s:\n",EnumAsString(analysis_type_list[i]));
60 analysis_type=analysis_type_list[i];
61 this->SetCurrentConfiguration(analysis_type);
62
63 _printf_(" create degrees of freedom\n");
64 VerticesDofx(&partition,&tpartition,vertices,parameters);
65 NodesDofx(nodes,parameters,analysis_type);
66
67 _printf_(" create single point constraints\n");
68 SpcNodesx( &m_yg[i], nodes,constraints,analysis_type);
69
70 _printf_(" create rigid body constraints\n");
71 MpcNodesx( &m_Rmg[i], nodes,constraints,analysis_type);
72
73 _printf_(" create node sets\n");
74 BuildNodeSetsx(&m_nodesets[i], nodes,analysis_type);
75
76 _printf_(" reducing single point constraints vector\n");
77 Reducevectorgtosx(&m_ys[i], m_yg[i],m_nodesets[i]);
78
79 _printf_(" normalizing rigid body constraints matrix\n");
80 NormalizeConstraintsx(&m_Gmn[i], m_Rmg[i],m_nodesets[i]);
81
82 _printf_(" configuring element and loads\n");
83 ConfigureObjectsx(elements, loads, nodes, vertices, materials,parameters);
84 }
85}
86/*}}}1*/
87/*FUNCTION FemModel::destructor {{{1*/
88FemModel::~FemModel(){
89
90 /*Intermediary*/
91 int i;
92
93 /*Delete all the datasets: */
94 xfree((void**)&analysis_type_list);
95 delete elements;
96 delete nodes;
97 delete vertices;
98 delete constraints;
99 delete loads;
100 delete materials;
101 delete parameters;
102 delete results;
103 VecFree(&partition);
104 VecFree(&tpartition);
105
106 for(i=0;i<nummodels;i++){
107 Mat temp_Rmg=m_Rmg[i];
108 MatFree(&temp_Rmg);
109 Mat temp_Gmn=m_Gmn[i];
110 MatFree(&temp_Gmn);
111 NodeSets* temp_nodesets=m_nodesets[i];
112 delete temp_nodesets;
113 Vec temp_yg=m_yg[i];
114 VecFree(&temp_yg);
115 Vec temp_ys=m_ys[i];
116 VecFree(&temp_ys);
117 }
118
119 /*Delete dynamically allocated arrays: */
120 xfree((void**)&m_Rmg);
121 xfree((void**)&m_Gmn);
122 xfree((void**)&m_nodesets);
123 xfree((void**)&m_yg);
124 xfree((void**)&m_ys);
125
126}
127/*}}}1*/
128
129/*Object management*/
130/*FUNCTION FemModel::Echo {{{1*/
131void FemModel::Echo(void){
132
133 printf("FemModel echo: \n");
134 printf(" number of fem models: %i\n",nummodels);
135 printf(" analysis_type_list: \n");
136 for(int i=0;i<nummodels;i++)printf(" %i: %s\n",i,EnumAsString(analysis_type_list[i]));
137 printf(" current analysis_type: \n");
138 printf(" %i: %s\n",analysis_counter,EnumAsString(analysis_type_list[analysis_counter]));
139
140
141}
142/*}}}*/
143
144/*Numerics: */
145/*FUNCTION FemModel::SetCurrentConfiguration(int configuration_type,int analysis_type){{{1*/
146void FemModel::SetCurrentConfiguration(int configuration_type,int analysis_type){
147
148 /*Use configuration_type to setup the analysis counter, the configurations of objects etc ... but use
149 * analysis_type to drive the element numerics. This allows for use of 1 configuration_type for several
150 * analyses. For example: do a SurfaceSlopeX, SurfaceSlopeY, BedSlopeX and BedSlopeY analysis using the
151 * Slope configuration.*/
152
153 int found=-1;
154 for(int i=0;i<nummodels;i++){
155 if (analysis_type_list[i]==configuration_type){
156 found=i;
157 break;
158 }
159 }
160 if(found!=-1) analysis_counter=found;
161 else ISSMERROR("Could not find alias for analysis_type %s in list of FemModel analyses",EnumAsString(configuration_type));
162
163 /*activate matrices/vectors: */
164 Rmg=m_Rmg[analysis_counter];
165 Gmn=m_Gmn[analysis_counter];
166 nodesets=m_nodesets[analysis_counter];
167 yg=m_yg[analysis_counter];
168 ys=m_ys[analysis_counter];
169
170 /*Now, plug analysis_counter and analysis_type inside the parameters: */
171 this->parameters->SetParam(analysis_counter,AnalysisCounterEnum);
172 this->parameters->SetParam(analysis_type,AnalysisTypeEnum);
173 this->parameters->SetParam(configuration_type,ConfigurationTypeEnum);
174
175 /*configure elements, loads and nodes, for this new analysis: */
176 this->elements-> Configure(elements,loads, nodes,vertices, materials,parameters);
177 this->nodes-> Configure(elements,loads, nodes,vertices, materials,parameters);
178 this->loads-> Configure(elements, loads, nodes,vertices, materials,parameters);
179
180}
181/*}}}1*/
182/*FUNCTION FemModel::SetCurrentConfiguration(int configuration_type){{{1*/
183void FemModel::SetCurrentConfiguration(int configuration_type){
184
185 /*overload: analysis_type = configuration_type: */
186 this->SetCurrentConfiguration(configuration_type,configuration_type);
187}
188/*}}}1*/
Note: See TracBrowser for help on using the repository browser.