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
Line 
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;
21
22 /*diagnostic: */
23 double* vx=NULL;
24 double* vy=NULL;
25 double* vz=NULL;
26 double* pressure=NULL;
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
35 double* vx_obs=NULL;
36 double* vy_obs=NULL;
37 double* control_parameter=NULL;
38
39 double* u_g_obs=NULL;
40 double* p_g=NULL;
41
42
43 /*diverse: */
44 int numberofnodes;
45 int analysis_type;
46 int count;
47
48 parameters->FindParam((void*)&analysis_type,"analysis_type");
49 count=parameters->Size();
50
51 parameters->FindParam((void*)&numberofnodes,"numberofnodes");
52
53 /*First serialize partition vector: */
54 if(part)VecToMPISerial(&partition,part);
55
56
57 if ( (analysis_type==ControlAnalysisEnum()) || (analysis_type==DiagnosticAnalysisEnum()) || (analysis_type==ThermalAnalysisEnum())){
58
59 parameters->FindParam((void*)&vx,"vx");
60 parameters->FindParam((void*)&vy,"vy");
61 parameters->FindParam((void*)&vz,"vz");
62
63 if(numberofnodes){
64 u_g=(double*)xcalloc(numberofnodes*3,sizeof(double));
65
66 if(vx){
67 for(i=0;i<numberofnodes;i++){
68 u_g[(int)(3*partition[i]+0)]=vx[i];
69 }
70 }
71
72 if(vy){
73 for(i=0;i<numberofnodes;i++){
74 u_g[(int)(3*partition[i]+1)]=vy[i];
75 }
76 }
77 if(vz){
78 for(i=0;i<numberofnodes;i++){
79 u_g[(int)(3*partition[i]+2)]=vz[i];
80 }
81 }
82
83
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);
89
90 /*erase old parameters: */
91 param=(Param*)parameters->FindParamObject("vx");
92 parameters->DeleteObject((Object*)param);
93
94 param=(Param*)parameters->FindParamObject("vy");
95 parameters->DeleteObject((Object*)param);
96
97 param=(Param*)parameters->FindParamObject("vz");
98 parameters->DeleteObject((Object*)param);
99 }
100
101 }
102
103
104 if(analysis_type==ControlAnalysisEnum()){
105
106 parameters->FindParam((void*)&vx_obs,"vx_obs");
107 parameters->FindParam((void*)&vy_obs,"vy_obs");
108 parameters->FindParam((void*)&control_parameter,"control_parameter");
109
110 /*Now, from vx_obs and vy_obs, build u_g_obs, correctly partitioned: */
111
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++){
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];
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);
129 param->SetDoubleVec(p_g,2*numberofnodes);
130 parameters->AddObject(param);
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
142 }
143
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
166 xfree((void**)&partition);
167
168 xfree((void**)&vx);
169 xfree((void**)&vy);
170 xfree((void**)&vz);
171 xfree((void**)&u_g);
172
173 xfree((void**)&vx_obs);
174 xfree((void**)&vy_obs);
175 xfree((void**)&pressure);
176 xfree((void**)&control_parameter);
177 xfree((void**)&u_g_obs);
178 xfree((void**)&p_g);
179
180}
Note: See TracBrowser for help on using the repository browser.