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

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

marshall.m is now automatically feedding off of model template for each field.
this necessitated a rewrite of the ModelProcessorx, so that instead of processing
strings, it processes now enums.

File size: 5.3 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));
[1881]41
[4004]42 /*Initialize: */
43 for(i=0;i<nummodels;i++)analysis_type_list[i]=analyses[i];
[3982]44
[6273]45 /*create datasets for all analyses*/
[4063]46 ModelProcessorx(&this->elements,&this->nodes,&this->vertices,&this->materials,&this->constraints,&this->loads,&this->parameters,IOMODEL,this->solution_type,nummodels,analyses);
[4004]47
[4063]48 /*do the post-processing of the datasets to get an FemModel that can actually run analyses: */
[4004]49 for(i=0;i<nummodels;i++){
50
[8224]51 _printf_(VerboseMProcessor()," Processing finite element model of analysis %s:\n",EnumToStringx(analysis_type_list[i]));
[4004]52 analysis_type=analysis_type_list[i];
[4356]53 this->SetCurrentConfiguration(analysis_type);
[4004]54
[6231]55 if(i==0){
[6412]56 _printf_(VerboseMProcessor()," create vertex degrees of freedom\n");
[6231]57 VerticesDofx(vertices,parameters); //only call once, we only have one set of vertices
58 }
[5772]59
[6412]60 _printf_(VerboseMProcessor()," resolve node constraints\n");
[5772]61 SpcNodesx(nodes,constraints,analysis_type);
62
[6412]63 _printf_(VerboseMProcessor()," create nodal degrees of freedom\n");
[4229]64 NodesDofx(nodes,parameters,analysis_type);
[5772]65
[6412]66 _printf_(VerboseMProcessor()," configuring element and loads\n");
[4034]67 ConfigureObjectsx(elements, loads, nodes, vertices, materials,parameters);
[4004]68 }
[6372]69
70 /*Close input file descriptors: */
71 if(my_rank==0) pfclose(IOMODEL,inputfilename);
72
73 /*Add output file name to parameters: */
[8926]74 this->parameters->AddObject(new StringParam(OutputfilenameEnum,outputfilename));
[6372]75
76#endif
77
[1881]78}
[6372]79
[3982]80/*}}}1*/
81/*FUNCTION FemModel::destructor {{{1*/
[1881]82FemModel::~FemModel(){
83
[4001]84 /*Intermediary*/
[3982]85 int i;
86
87 /*Delete all the datasets: */
88 xfree((void**)&analysis_type_list);
[1881]89 delete elements;
90 delete nodes;
[3417]91 delete vertices;
[3982]92 delete constraints;
[1881]93 delete loads;
94 delete materials;
95 delete parameters;
[4050]96 delete results;
[3982]97
[1881]98}
[3982]99/*}}}1*/
100
101/*Object management*/
102/*FUNCTION FemModel::Echo {{{1*/
103void FemModel::Echo(void){
104
105 printf("FemModel echo: \n");
106 printf(" number of fem models: %i\n",nummodels);
107 printf(" analysis_type_list: \n");
[8224]108 for(int i=0;i<nummodels;i++)printf(" %i: %s\n",i,EnumToStringx(analysis_type_list[i]));
[3982]109 printf(" current analysis_type: \n");
[8224]110 printf(" %i: %s\n",analysis_counter,EnumToStringx(analysis_type_list[analysis_counter]));
[3982]111
112}
[4001]113/*}}}*/
[3982]114
115/*Numerics: */
[4422]116/*FUNCTION FemModel::SetCurrentConfiguration(int configuration_type,int analysis_type){{{1*/
[4356]117void FemModel::SetCurrentConfiguration(int configuration_type,int analysis_type){
[4055]118
[4356]119 /*Use configuration_type to setup the analysis counter, the configurations of objects etc ... but use
120 * analysis_type to drive the element numerics. This allows for use of 1 configuration_type for several
121 * analyses. For example: do a SurfaceSlopeX, SurfaceSlopeY, BedSlopeX and BedSlopeY analysis using the
[4402]122 * Slope configuration.*/
[4356]123
[3982]124 int found=-1;
[4001]125 for(int i=0;i<nummodels;i++){
[4356]126 if (analysis_type_list[i]==configuration_type){
[3982]127 found=i;
128 break;
129 }
130 }
[4001]131 if(found!=-1) analysis_counter=found;
[8224]132 else _error_("Could not find alias for analysis_type %s in list of FemModel analyses",EnumToStringx(configuration_type));
[4055]133
[4059]134 /*Now, plug analysis_counter and analysis_type inside the parameters: */
135 this->parameters->SetParam(analysis_counter,AnalysisCounterEnum);
136 this->parameters->SetParam(analysis_type,AnalysisTypeEnum);
[4356]137 this->parameters->SetParam(configuration_type,ConfigurationTypeEnum);
[4573]138
139 /*configure elements, loads and nodes, for this new analysis: */
[4575]140 this->elements->SetCurrentConfiguration(elements,loads, nodes,vertices, materials,parameters);
141 this->nodes->SetCurrentConfiguration(elements,loads, nodes,vertices, materials,parameters);
142 this->loads->SetCurrentConfiguration(elements, loads, nodes,vertices, materials,parameters);
[4573]143
[8263]144 /*take care of petsc options, that depend on this analysis type (present only after model processor)*/
145 if(this->parameters->Exist(PetscOptionsStringsEnum)){
146 PetscOptionsFromAnalysis(this->parameters,analysis_type);
147 _printf_(VerboseSolver()," petsc Options set for analysis type: %s\n",EnumToStringx(analysis_type));
148 }
[6014]149
[3982]150}
151/*}}}1*/
[4422]152/*FUNCTION FemModel::SetCurrentConfiguration(int configuration_type){{{1*/
[4356]153void FemModel::SetCurrentConfiguration(int configuration_type){
[4059]154
[4356]155 /*overload: analysis_type = configuration_type: */
156 this->SetCurrentConfiguration(configuration_type,configuration_type);
[4055]157}
158/*}}}1*/
Note: See TracBrowser for help on using the repository browser.