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

Last change on this file since 8263 was 8263, checked in by Mathieu Morlighem, 14 years ago

Error out when parameter is not found (use Exist to check wether it exist or not)

File size: 6.1 KB
RevLine 
[1881]1/*!\file FemModel.c
2 * \brief: implementation of the FemModel object
3 */
4
[3982]5
[1881]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"
[4236]13#include "../Container/Container.h"
[4009]14#include "../modules/ModelProcessorx/ModelProcessorx.h"
[3982]15#include "./objects.h"
[3775]16#include "../include/include.h"
[3982]17#include "../EnumDefinitions/EnumDefinitions.h"
18#include "../modules/modules.h"
[1881]19
[3982]20/*Object constructors and destructor*/
21/*FUNCTION FemModel::constructor {{{1*/
[6372]22FemModel::FemModel(char* inputfilename, char* outputfilename, const int in_solution_type,const int* analyses,const int nummodels){
23#ifdef _PARALLEL_
[1881]24
[4001]25 /*intermediary*/
26 int i;
[4004]27 int analysis_type;
[6372]28 FILE* IOMODEL;
[4001]29
[6372]30 /*Open input file on cpu 0: */
31 if(my_rank==0) IOMODEL= pfopen(inputfilename ,"rb");
32
[4028]33 /*Initialize internal data: */
[4004]34 this->nummodels=nummodels;
[4028]35 this->solution_type=in_solution_type;
[4063]36 this->analysis_counter=nummodels-1; //point to last analysis_type carried out.
[6372]37 this->results=new Results(); //not initialized by CreateDataSets
[3982]38
39 /*Dynamically allocate whatever is a list of length nummodels: */
40 analysis_type_list=(int*)xmalloc(nummodels*sizeof(int));
[4055]41 m_nodesets=(NodeSets**)xmalloc(nummodels*sizeof(NodeSets*));
42 m_ys=(Vec*)xmalloc(nummodels*sizeof(Vec));
[1881]43
[4004]44 /*Initialize: */
45 for(i=0;i<nummodels;i++)analysis_type_list[i]=analyses[i];
[4055]46 for(i=0;i<nummodels;i++)m_nodesets[i]=NULL;
47 for(i=0;i<nummodels;i++)m_ys[i]=NULL;
[3982]48
[6273]49 /*create datasets for all analyses*/
[4063]50 ModelProcessorx(&this->elements,&this->nodes,&this->vertices,&this->materials,&this->constraints,&this->loads,&this->parameters,IOMODEL,this->solution_type,nummodels,analyses);
[4004]51
[4063]52 /*do the post-processing of the datasets to get an FemModel that can actually run analyses: */
[4004]53 for(i=0;i<nummodels;i++){
54
[8224]55 _printf_(VerboseMProcessor()," Processing finite element model of analysis %s:\n",EnumToStringx(analysis_type_list[i]));
[4004]56 analysis_type=analysis_type_list[i];
[4356]57 this->SetCurrentConfiguration(analysis_type);
[4004]58
[6231]59 if(i==0){
[6412]60 _printf_(VerboseMProcessor()," create vertex degrees of freedom\n");
[6231]61 VerticesDofx(vertices,parameters); //only call once, we only have one set of vertices
62 }
[5772]63
[6412]64 _printf_(VerboseMProcessor()," resolve node constraints\n");
[5772]65 SpcNodesx(nodes,constraints,analysis_type);
66
[6412]67 _printf_(VerboseMProcessor()," create nodal degrees of freedom\n");
[4229]68 NodesDofx(nodes,parameters,analysis_type);
[5772]69
[6412]70 _printf_(VerboseMProcessor()," create nodal constraints vector\n");
[5772]71 CreateNodalConstraintsx(&m_ys[i],nodes,analysis_type);
[4004]72
[6412]73 _printf_(VerboseMProcessor()," create node sets\n");
[4055]74 BuildNodeSetsx(&m_nodesets[i], nodes,analysis_type);
[4004]75
[6412]76 _printf_(VerboseMProcessor()," configuring element and loads\n");
[4034]77 ConfigureObjectsx(elements, loads, nodes, vertices, materials,parameters);
[4004]78 }
[6372]79
80 /*Close input file descriptors: */
81 if(my_rank==0) pfclose(IOMODEL,inputfilename);
82
83 /*Add output file name to parameters: */
84 this->parameters->AddObject(new StringParam(OutputFileNameEnum,outputfilename));
85
86#endif
87
[1881]88}
[6372]89
[3982]90/*}}}1*/
91/*FUNCTION FemModel::destructor {{{1*/
[1881]92FemModel::~FemModel(){
93
[4001]94 /*Intermediary*/
[3982]95 int i;
96
97 /*Delete all the datasets: */
98 xfree((void**)&analysis_type_list);
[1881]99 delete elements;
100 delete nodes;
[3417]101 delete vertices;
[3982]102 delete constraints;
[1881]103 delete loads;
104 delete materials;
105 delete parameters;
[4050]106 delete results;
[3982]107
108 for(i=0;i<nummodels;i++){
[4055]109 NodeSets* temp_nodesets=m_nodesets[i];
110 delete temp_nodesets;
111 Vec temp_ys=m_ys[i];
[3982]112 VecFree(&temp_ys);
113 }
114
115 /*Delete dynamically allocated arrays: */
[4137]116 xfree((void**)&m_nodesets);
117 xfree((void**)&m_ys);
[1881]118
119}
[3982]120/*}}}1*/
121
122/*Object management*/
123/*FUNCTION FemModel::Echo {{{1*/
124void FemModel::Echo(void){
125
126 printf("FemModel echo: \n");
127 printf(" number of fem models: %i\n",nummodels);
128 printf(" analysis_type_list: \n");
[8224]129 for(int i=0;i<nummodels;i++)printf(" %i: %s\n",i,EnumToStringx(analysis_type_list[i]));
[3982]130 printf(" current analysis_type: \n");
[8224]131 printf(" %i: %s\n",analysis_counter,EnumToStringx(analysis_type_list[analysis_counter]));
[3982]132
133
134}
[4001]135/*}}}*/
[3982]136
137/*Numerics: */
[4422]138/*FUNCTION FemModel::SetCurrentConfiguration(int configuration_type,int analysis_type){{{1*/
[4356]139void FemModel::SetCurrentConfiguration(int configuration_type,int analysis_type){
[4055]140
[4356]141 /*Use configuration_type to setup the analysis counter, the configurations of objects etc ... but use
142 * analysis_type to drive the element numerics. This allows for use of 1 configuration_type for several
143 * analyses. For example: do a SurfaceSlopeX, SurfaceSlopeY, BedSlopeX and BedSlopeY analysis using the
[4402]144 * Slope configuration.*/
[4356]145
[3982]146 int found=-1;
[4001]147 for(int i=0;i<nummodels;i++){
[4356]148 if (analysis_type_list[i]==configuration_type){
[3982]149 found=i;
150 break;
151 }
152 }
[4001]153 if(found!=-1) analysis_counter=found;
[8224]154 else _error_("Could not find alias for analysis_type %s in list of FemModel analyses",EnumToStringx(configuration_type));
[4055]155
156 /*activate matrices/vectors: */
157 nodesets=m_nodesets[analysis_counter];
158 ys=m_ys[analysis_counter];
159
[4059]160 /*Now, plug analysis_counter and analysis_type inside the parameters: */
161 this->parameters->SetParam(analysis_counter,AnalysisCounterEnum);
162 this->parameters->SetParam(analysis_type,AnalysisTypeEnum);
[4356]163 this->parameters->SetParam(configuration_type,ConfigurationTypeEnum);
[4573]164
165 /*configure elements, loads and nodes, for this new analysis: */
[4575]166 this->elements->SetCurrentConfiguration(elements,loads, nodes,vertices, materials,parameters);
167 this->nodes->SetCurrentConfiguration(elements,loads, nodes,vertices, materials,parameters);
168 this->loads->SetCurrentConfiguration(elements, loads, nodes,vertices, materials,parameters);
[4573]169
[8263]170 /*take care of petsc options, that depend on this analysis type (present only after model processor)*/
171 if(this->parameters->Exist(PetscOptionsStringsEnum)){
172 PetscOptionsFromAnalysis(this->parameters,analysis_type);
173 _printf_(VerboseSolver()," petsc Options set for analysis type: %s\n",EnumToStringx(analysis_type));
174 }
[6014]175
[3982]176}
177/*}}}1*/
[4422]178/*FUNCTION FemModel::SetCurrentConfiguration(int configuration_type){{{1*/
[4356]179void FemModel::SetCurrentConfiguration(int configuration_type){
[4059]180
[4356]181 /*overload: analysis_type = configuration_type: */
182 this->SetCurrentConfiguration(configuration_type,configuration_type);
[4055]183}
184/*}}}1*/
Note: See TracBrowser for help on using the repository browser.