source: issm/trunk/src/c/ProcessParamsx/ProcessParamsx.cpp@ 503

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

Fixed all bugs for conduction, thermal steady solution

File size: 4.3 KB
RevLine 
[1]1/*!\file ProcessParamsx
2 * \brief: process parameters using partitioning vector
3 */
4
5#include "./ProcessParamsx.h"
6
7#undef __FUNCT__
8#define __FUNCT__ "ProcessParamsx"
9
10#include "../shared/shared.h"
11#include "../include/macros.h"
12#include "../toolkits/toolkits.h"
13#include "../EnumDefinitions/EnumDefinitions.h"
14
15void ProcessParamsx( DataSet* parameters, Vec part){
16
17 int i;
18
19 double* partition=NULL;
20 Param* param=NULL;
[202]21
22 /*diagnostic: */
23 double* vx=NULL;
24 double* vy=NULL;
25 double* vz=NULL;
[503]26 double* pressure=NULL;
[202]27
28 double* u_g=NULL;
29
30 /*control: */
31 Vec vec_vx_obs=NULL;
32 Vec vec_vy_obs=NULL;
33 Vec vec_control_parameter=NULL;
34
[1]35 double* vx_obs=NULL;
36 double* vy_obs=NULL;
37 double* control_parameter=NULL;
[202]38
39 double* u_g_obs=NULL;
40 double* p_g=NULL;
41
42
43 /*diverse: */
[1]44 int numberofnodes;
45 int analysis_type;
46 int count;
47
48 parameters->FindParam((void*)&analysis_type,"analysis_type");
49 count=parameters->Size();
[202]50
51 parameters->FindParam((void*)&numberofnodes,"numberofnodes");
[1]52
[202]53 /*First serialize partition vector: */
[304]54 if(part)VecToMPISerial(&partition,part);
55
[202]56
[503]57 if ( (analysis_type==ControlAnalysisEnum()) || (analysis_type==DiagnosticAnalysisEnum()) || (analysis_type==ThermalAnalysisEnum())){
[202]58
[209]59 parameters->FindParam((void*)&vx,"vx");
60 parameters->FindParam((void*)&vy,"vy");
61 parameters->FindParam((void*)&vz,"vz");
[202]62
[304]63 if(numberofnodes){
64 u_g=(double*)xcalloc(numberofnodes*3,sizeof(double));
[202]65
[304]66 if(vx){
67 for(i=0;i<numberofnodes;i++){
68 u_g[(int)(3*partition[i]+0)]=vx[i];
69 }
[202]70 }
71
[304]72 if(vy){
73 for(i=0;i<numberofnodes;i++){
74 u_g[(int)(3*partition[i]+1)]=vy[i];
75 }
[202]76 }
[304]77 if(vz){
78 for(i=0;i<numberofnodes;i++){
79 u_g[(int)(3*partition[i]+2)]=vz[i];
80 }
[202]81 }
82
83
[304]84 /*Now, create new parameters: */
85 count++;
86 param= new Param(count,"u_g",DOUBLEVEC);
87 param->SetDoubleVec(u_g,3*numberofnodes);
88 parameters->AddObject(param);
[202]89
[304]90 /*erase old parameters: */
91 param=(Param*)parameters->FindParamObject("vx");
92 parameters->DeleteObject((Object*)param);
[202]93
[304]94 param=(Param*)parameters->FindParamObject("vy");
95 parameters->DeleteObject((Object*)param);
[202]96
[304]97 param=(Param*)parameters->FindParamObject("vz");
98 parameters->DeleteObject((Object*)param);
99 }
[202]100
101 }
102
103
[1]104 if(analysis_type==ControlAnalysisEnum()){
105
[209]106 parameters->FindParam((void*)&vx_obs,"vx_obs");
107 parameters->FindParam((void*)&vy_obs,"vy_obs");
108 parameters->FindParam((void*)&control_parameter,"control_parameter");
[1]109
110 /*Now, from vx_obs and vy_obs, build u_g_obs, correctly partitioned: */
[202]111
[1]112 u_g_obs=(double*)xcalloc(numberofnodes*2,sizeof(double));
113 p_g=(double*)xcalloc(numberofnodes*2,sizeof(double));
114
115 for(i=0;i<numberofnodes;i++){
[202]116 u_g_obs[(int)(2*partition[i]+0)]=vx_obs[i];
117 u_g_obs[(int)(2*partition[i]+1)]=vy_obs[i];
118 p_g[(int)(2*partition[i]+0)]=control_parameter[i];
[1]119 }
120
121 /*Now, create new parameters: */
122 count++;
123 param= new Param(count,"u_g_obs",DOUBLEVEC);
124 param->SetDoubleVec(u_g_obs,2*numberofnodes);
125 parameters->AddObject(param);
126
127 count++;
128 param= new Param(count,"p_g",DOUBLEVEC);
[219]129 param->SetDoubleVec(p_g,2*numberofnodes);
[1]130 parameters->AddObject(param);
[202]131
132 /*erase old parameter: */
133 param=(Param*)parameters->FindParamObject("vx_obs");
134 parameters->DeleteObject((Object*)param);
135
136 param=(Param*)parameters->FindParamObject("vy_obs");
137 parameters->DeleteObject((Object*)param);
138
139 param=(Param*)parameters->FindParamObject("control_parameter");
140 parameters->DeleteObject((Object*)param);
141
[1]142 }
143
[503]144 if(analysis_type==ThermalAnalysisEnum()){
145
146 parameters->FindParam((void*)&pressure,"pressure");
147
148 /*Now, from pressure, build p_g, correctly partitioned: */
149 p_g=(double*)xcalloc(numberofnodes,sizeof(double));
150
151 for(i=0;i<numberofnodes;i++){
152 p_g[(int)(partition[i])]= pressure[i];
153 }
154
155 /*Now, create new parameter: */
156 count++;
157 param= new Param(count,"p_g",DOUBLEVEC);
158 param->SetDoubleVec(p_g,numberofnodes);
159 parameters->AddObject(param);
160
161 /*erase old parameter: */
162 param=(Param*)parameters->FindParamObject("pressure");
163 parameters->DeleteObject((Object*)param);
164 }
165
[1]166 xfree((void**)&partition);
[202]167
168 xfree((void**)&vx);
169 xfree((void**)&vy);
170 xfree((void**)&vz);
171 xfree((void**)&u_g);
172
[1]173 xfree((void**)&vx_obs);
174 xfree((void**)&vy_obs);
[503]175 xfree((void**)&pressure);
[1]176 xfree((void**)&control_parameter);
177 xfree((void**)&u_g_obs);
178 xfree((void**)&p_g);
[202]179
[1]180}
Note: See TracBrowser for help on using the repository browser.