AcouSTO  version 2.0

◆ read_modsol()

int read_modsol ( )

Only Representation

22  {
23 
24  int i, ifreq, iphfr, nome;
25  int ltmp;
26  double dtmp;
27  DOUBLE impedreal, impedimag;
28  DOUBLE radreal, radimag;
29 
30  config_setting_t* freq_resp_cnt_cont;
31  config_setting_t* freq_resp_mic_cont;
32  const char* solvertype = NULL;
33 
34  config_setting_t* phystagcont; //gp
35  struct gmsh_bc *gmshbc; //gp
36  const char* phystagname; //gp
37  char varname[MAX_PATH]; //gp
38 // char *multif; //ui
39  char physnamfreq[MAX_PATH]; //ui
40 
41 // /* INIT MODCOEFAC */
42 // CONFIG_GET_INT(config, "modcoefac.active", modcoefacinfo->active);
43 //
44 // /* INIT MODCOEMIC */
45 // CONFIG_GET_INT(config, "modcoemic.active", modcoemicinfo->active);
46 
47  /* INIT MODSOLINFO */
48  CONFIG_GET_INT(config, "modsol.active", modsolinfo->active);
49 
50 
51  /* INIT MODSOLINFO */
52  CONFIG_GET_INT(config, "modsol.active", modsolinfo->active);
53 
54  CONFIG_GET_INT(config, "modsol.nome", modsolinfo->nome);
55  nome = modsolinfo->nome;
56 
57  if(NULL != CONFIG_LOOKUP(config,"modsol.sources_file")){
58  CONFIG_GET_STRING(config, "modsol.sources_file",fileinfo->sources_file);
60  logger(LOG_ERROR,"File %s not present\n",fileinfo->sources_file);
61  return -1;
62  }
63  }
64 
65  if(NULL != CONFIG_LOOKUP(config,"modsol.dipoles_file")){
66  CONFIG_GET_STRING(config, "modsol.dipoles_file",fileinfo->dipoles_file);
68  logger(LOG_ERROR,"File %s not present\n",fileinfo->dipoles_file);
69  return -1;
70  }
71  }
72 
73  if(NULL != CONFIG_LOOKUP(config,"modsol.planw_file")){
74  CONFIG_GET_STRING(config, "modsol.planw_file", fileinfo->planw_file);
76  logger(LOG_ERROR,"File %s not present\n",fileinfo->planw_file);
77  return -1;
78  }
79  }
80 
81  CONFIG_GET_INT(config, "modsol.dirneu", modsolinfo->dirneu);
82  if(NULL == CONFIG_LOOKUP(config, "modsol.dirneu")){
83  modsolinfo->dirneu = 2;
84  logger(LOG_INFO,"dirneu defaults to 2 (Neumann-type conditions) if not present in config file\n");
85  }
86 
87  CONFIG_GET_INT(config, "modsol.custombc", modsolinfo->custombc);
88  if(NULL == CONFIG_LOOKUP(config, "modsol.custombc")){
89  modsolinfo->custombc = 0;
90  logger(LOG_INFO,"custombc defaults to 0 if not present in config file\n");
91  }
92 
93  if (2 == modsolinfo->custombc){ // gp
94  phystagcont = config_lookup(&config,"modsol.gmshbc");
95  phystagname = config_setting_get_string_elem(phystagcont,0); // ui - reads tagname
96  multif = strchr(phystagname, '%'); // ui - looks for frequency dependent boundary properties
97  if (NULL != multif) {
98  phystags = malloc(sizeof(struct phystag)*config_setting_length(phystagcont)*nome);
99  fileinfo->bc_lambda_file = "exported_gmshbc_lambda%d";
100  fileinfo->bc_gamma_file = "exported_gmshbc_gamma%d";
101  fileinfo->bc_func_file = "exported_gmshbc_func%d";
102  CONFIG_GET_STRING(config, "modsol.bc_g_file", fileinfo->bc_g_file);
103  }else{
104  phystags = malloc(sizeof(struct phystag)*config_setting_length(phystagcont));
105  fileinfo->bc_lambda_file = "exported_gmshbc_lambda";
106  fileinfo->bc_gamma_file = "exported_gmshbc_gamma";
107  fileinfo->bc_func_file = "exported_gmshbc_func";
108  CONFIG_GET_STRING(config, "modsol.bc_g_file", fileinfo->bc_g_file);
109  }
110  nphystags = config_setting_length(phystagcont);
111  logger(LOG_INFO,"n physical tags = %d\n",nphystags);
112  for (i=0; i<nphystags; i++){
113  phystagname = config_setting_get_string_elem(phystagcont,i); // ui - reads tagname
114  if (NULL != multif) {
115  for(ifreq=0;ifreq<nome;ifreq++){
116  sprintf(physnamfreq,phystagname,ifreq); // ui - appends frequency index
117  gmshbc = malloc(sizeof(struct gmsh_bc));
118  iphfr = ifreq + i*nome;
119  if(-1 == read_gmshbc(iphfr,physnamfreq,gmshbc)) return -1;
120  }
121  } else {
122  logger(LOG_DEBUG, "reading physical tag [%s]\n", phystagname);
123  sprintf(varname, "%s.tag", phystagname);
124  if(NULL == CONFIG_LOOKUP(config, varname)){
125  logger(LOG_ERROR,"You must provide a valid physical tag\n");
126  exit(1);
127  }
128  gmshbc = malloc(sizeof(struct gmsh_bc));
129  if(-1 == read_gmshbc(i,phystagname,gmshbc)) return -1;
130  }
131  }
132 
133  CONFIG_GET_STRING(config, "modsol.bc_g_file", fileinfo->bc_g_file);
134 // CONFIG_GET_INT(config, "modsol.nimped", modsolinfo->nimped);
135 // CONFIG_GET_INT(config, "modsol.nradian", modsolinfo->nradian);
136  }else if (1 == modsolinfo->custombc){
137  CONFIG_GET_STRING(config, "modsol.bc_lambda_file", fileinfo->bc_lambda_file);
138  CONFIG_GET_STRING(config, "modsol.bc_gamma_file", fileinfo->bc_gamma_file);
139  CONFIG_GET_STRING(config, "modsol.bc_func_file", fileinfo->bc_func_file);
140  CONFIG_GET_STRING(config, "modsol.bc_g_file", fileinfo->bc_g_file);
141 // CONFIG_GET_INT(config, "modsol.nimped", modsolinfo->nimped);
142 // CONFIG_GET_INT(config, "modsol.nradian", modsolinfo->nradian);
143  } else if (0 == modsolinfo->custombc){
144  CONFIG_GET_INT(config, "modsol.nimped", modsolinfo->nimped);
145  CONFIG_GET_INT(config, "modsol.nradian", modsolinfo->nradian);
146  CONFIG_GET_STRING(config, "modsol.imped_file", fileinfo->imped_file);
147  CONFIG_GET_STRING(config, "modsol.radiants_file", fileinfo->radiants_file);
148  CONFIG_GET_FLOAT(config, "modsol.radiant_real", radreal);
149  CONFIG_GET_FLOAT(config, "modsol.radiant_imag", radimag);
150  modsolinfo->radiantfield = radreal + I * radimag;
151  logger(LOG_DEBUG, "modsolinfo.radiant=%f +I %f\n", CREAL(modsolinfo->radiantfield), CIMAG(modsolinfo->radiantfield));
152  CONFIG_GET_FLOAT(config, "modsol.impedance_real", impedreal);
153  CONFIG_GET_FLOAT(config, "modsol.impedance_imag", impedimag);
154  modsolinfo->impedance = impedreal + I * impedimag;
155  logger(LOG_DEBUG, "modsolinfo.impedance=%f +I %f\n", CREAL(modsolinfo->impedance), CIMAG(modsolinfo->impedance));
156  //
157  // checking if body is uniformly radiant (nradian < 0)
158  modsolinfo->radiantbody = 0;
159  if (modsolinfo->nradian < 0) {
160  modsolinfo->radiantbody = 1;
162  logger(LOG_DEBUG, "Body is uniformly radiant, nradian=%d\n", modsolinfo->nradian);
163  }
164  // checking if body is uniformly impedent (nimped < 0)
166  if (modsolinfo->nimped < 0) {
169  logger(LOG_DEBUG, "Body is uniformly impedent, nimped=%d\n", modsolinfo->nimped);
170  }
171  }
172 
173  CONFIG_GET_INT(config, "modsol.knw", modsolinfo->knw);
174  if(NULL == CONFIG_LOOKUP(config, "modsol.knw")){
175  modsolinfo->knw = 2;
176  logger(LOG_INFO,"knw defaults to 2 if not present in config file\n");
177  }
178  if(1 == modsolinfo->knw && modgeominfo->nchief > 0){
179  logger(LOG_ERROR,"KNW = %d and NCHIEF = %d. CHIEF technique can be used only with KNW=2 \n",modsolinfo->knw,modgeominfo->nchief);
180  return -1;
181  }
182 
183  CONFIG_GET_INT(config, "modsol.nsourc", modsolinfo->nsourc);
184  CONFIG_GET_INT(config, "modsol.ndipoles", modsolinfo->ndipoles);
185  CONFIG_GET_INT(config, "modsol.nplanw", modsolinfo->nplanw);
186 
187  if(1 == modsolinfo->knw && modsolinfo->nplanw > 0){
188  logger(LOG_ERROR,"KNW = %d and NPLANW = %d. KNW=1 cannot be used in presence of impinging waves. \n",modsolinfo->knw,modsolinfo->nplanw);
189  return -1;
190  }
191 
192  CONFIG_GET_STRING(config, "modsol.sources_file",fileinfo->sources_file);
194  logger(LOG_ERROR,"File %s not present\n",fileinfo->sources_file);
195  return -1;
196  }
197  CONFIG_GET_STRING(config, "modsol.dipoles_file",fileinfo->dipoles_file);
199  logger(LOG_ERROR,"File %s not present\n",fileinfo->dipoles_file);
200  return -1;
201  }
202  CONFIG_GET_STRING(config, "modsol.planw_file", fileinfo->planw_file);
203  if(0 != modsolinfo->nplanw && NULL != fileinfo->planw_file && !file_exists(fileinfo->planw_file)){
204  logger(LOG_ERROR,"File %s not present\n",fileinfo->planw_file);
205  return -1;
206  }
207 
208  CONFIG_GET_FLOAT(config, "modsol.rho", modsolinfo->rho);
209  CONFIG_GET_FLOAT(config, "modsol.maxsig", modsolinfo->maxsig);
210  CONFIG_GET_FLOAT(config, "modsol.minsig", modsolinfo->minsig);
211  CONFIG_GET_INT(config, "modsol.nsig", modsolinfo->nsig);
212 
213  if (NULL == CONFIG_LOOKUP(config,"modsol.maxome") || NULL == CONFIG_LOOKUP(config,"modsol.minome")) {
214  if (NULL == CONFIG_LOOKUP(config,"modsol.maxfreq") || NULL == CONFIG_LOOKUP(config,"modsol.minfreq")) {
216  return -1;
217  }
218 
219  logger(LOG_DEBUG, "Omega not found, reading fequency\n");
220 
221  CONFIG_GET_FLOAT(config, "modsol.maxfreq", modsolinfo->maxfreq);
222  CONFIG_GET_FLOAT(config, "modsol.minfreq", modsolinfo->minfreq);
223  modsolinfo->maxome = 2.0 * PI * modsolinfo->maxfreq; // Hz->rad/sec conversion
224  modsolinfo->minome = 2.0 * PI * modsolinfo->minfreq;
225  logger(LOG_DEBUG, "Calculated Omega:[%f, %f]\n", modsolinfo->minome, modsolinfo->maxome);
226 
227  } else {
228  logger(LOG_DEBUG, "Found Omega\n");
229  CONFIG_GET_FLOAT(config, "modsol.maxome", modsolinfo->maxome);
230  CONFIG_GET_FLOAT(config, "modsol.minome", modsolinfo->minome);
231  }
232 
233  CONFIG_GET_INT(config, "modsol.icnmon", modsolinfo->icnmon);
234  CONFIG_GET_INT(config, "modsol.iommon", modsolinfo->iommon);
235  CONFIG_GET_INT(config, "modsol.imimon", modsolinfo->imimon);
236  CONFIG_GET_INT(config, "modsol.printout", modsolinfo->printout);
237  CONFIG_GET_INT(config, "modsol.printvtk", modsolinfo->printvtk);
238  CONFIG_GET_INT(config, "modsol.printmsh", modsolinfo->printmsh);
239  CONFIG_GET_INT(config, "modsol.printwrl", modsolinfo->printwrl);
240 
241  if (modsolinfo->nome <= 0) {
243  "Number of frequencies (%d) is not >0, no solution will be evaluated\n",
244  modsolinfo->nome);
245  }
246 
247  freq_resp_cnt_cont = config_lookup(&config, "modsol.freq_resp_cnt");
248  freq_resp_mic_cont = config_lookup(&config, "modsol.freq_resp_mic");
249  if (freq_resp_cnt_cont != NULL) {
250  modsolinfo->n_freqresp_cnt = config_setting_length( freq_resp_cnt_cont);
251  logger(LOG_DEBUG, "modsolinfo->n_freqresp_cnt=%d\n", modsolinfo->n_freqresp_cnt);
253  for (i = 0; i < modsolinfo->n_freqresp_cnt; i++) {
254  solution->i_freqresp_cnt[i] = config_setting_get_int_elem( freq_resp_cnt_cont, i);
255  logger(LOG_DEBUG, " solution->i_freqresp_cnt[%d] = %d\n", i, solution->i_freqresp_cnt[i]);
256  }
257  }
258 
259  if (freq_resp_mic_cont != NULL) {
260  modsolinfo->n_freqresp_mic = config_setting_length( freq_resp_mic_cont);
261  logger(LOG_DEBUG, "modsolinfo->n_freqresp_mic=%d\n", modsolinfo->n_freqresp_mic);
263  for (i = 0; i < modsolinfo->n_freqresp_mic; i++) {
264  solution->i_freqresp_mic[i] = config_setting_get_int_elem( freq_resp_mic_cont, i);
265  logger(LOG_DEBUG, " solution->i_freqresp_mic[%d] = %d\n", i, solution->i_freqresp_mic[i]);
266  }
267  }
268 
270  if (config_lookup(&config, "modsol.pre_calculate_coefs") != NULL) {
271  CONFIG_GET_INT(config, "modsol.pre_calculate_coefs", modsolinfo->pre_calculate_coefs);
272 
273  if (((runinfo->krow < modgeominfo->ncntr) && (runinfo->krow > 0))
274  && (modsolinfo->pre_calculate_coefs == 0)) {
276  logger(LOG_ERROR, "ACOUSTO WILL STOP\n");
277  return -1;
278  }
279  }
280 
281  // Checking (Imposing) active modules consistency
283  modcoefacinfo->active == 1;
284  modcoemicinfo->active == 1;
285  logger(LOG_INFO, "If coefficients are precalculated, modcoefac.active and modcoemic.active default to 1 (for v1.6 legacy consistency) \n");
286  //if(modsolinfo->active == 1){ // gp commented because nosense
287  // cleanup();
288  //return -1;
289  //}
290  }
291 
292  // Getting solver type
293  if (NULL != config_lookup(&config, "modsol.solver")) {
294  CONFIG_GET_STRING(config, "modsol.solver", solvertype);
295  if (NULL != solvertype) {
296  if (NULL != strstr("GMRES", solvertype)) {
297  logger(LOG_INFO, "GMRES Solver chosen\n");
299  CONFIG_GET_FLOAT(config, "modsol.tolerance", modsolinfo->tolerance);
300  CONFIG_GET_INT(config, "modsol.maxiterations", modsolinfo->maxiterations);
301  CONFIG_GET_INT(config, "modsol.restart", modsolinfo->restart);
302  } else {
303  logger(LOG_INFO, "Pseudoinverse Solver chosen\n");
305  }
306  }
307  } else {
308  logger(LOG_INFO, "Pseudoinverse Solver chosen\n");
310  }
311 
312 
314  modsolinfo->onlyrep = 0;
315  if (config_lookup(&config, "modsol.onlyrep") != NULL) {
316  CONFIG_GET_INT(config, "modsol.onlyrep", modsolinfo->onlyrep);
317  }
318  return 0;
319 }
#define CONFIG_GET_INT(config, name, var)
Definition: config.h:47
int * i_freqresp_cnt
Definition: structs.h:610
struct run_info * runinfo
Definition: globals.h:34
const char * bc_gamma_file
Definition: structs.h:422
#define CONFIG_GET_STRING(config, name, var)
Definition: config.h:48
int ncntr
Definition: structs.h:299
External geometry boundary conditions assigned with physical tags stored in .msh file using GMSH v2...
Definition: structs.h:261
int nimped
Definition: structs.h:450
#define CONFIG_LOOKUP(config, name)
Definition: config.h:49
int read_gmshbc(int iphys, const char *phystagname, struct gmsh_bc *gmshgeom)
Definition: gmsh.c:22
int icnmon
Definition: structs.h:459
#define CREAL(x)
Definition: functions.h:49
int * i_freqresp_mic
Definition: structs.h:612
DOUBLE minsig
Definition: structs.h:480
BOOL radiantbody
Definition: structs.h:489
Definition: structs.h:430
int ndipoles
Definition: structs.h:503
BOOL active
Definition: structs.h:393
int nsourc
Definition: structs.h:448
int n_freqresp_mic
Definition: structs.h:499
#define CIMAG(x)
Definition: functions.h:50
int nchief
Definition: structs.h:301
DOUBLE maxome
Definition: structs.h:466
BOOL onlyrep
Definition: structs.h:526
struct phystag * phystags
Definition: globals.h:58
DOUBLE tolerance
Definition: structs.h:510
#define LOG_INFO
Definition: logger.h:26
int nsig
Definition: structs.h:456
int n_freqresp_cnt
Definition: structs.h:497
char * multif
Definition: globals.h:60
struct file_info * fileinfo
Definition: globals.h:32
int knw
Definition: structs.h:446
DOUBLE minfreq
Definition: structs.h:473
Definition: structs.h:429
DOUBLE maxfreq
Definition: structs.h:471
struct modcoefac_info * modcoefacinfo
Definition: globals.h:40
const char * dipoles_file
Definition: structs.h:418
BOOL active
Definition: structs.h:356
COMPLEX radiantfield
Definition: structs.h:493
const char * planw_file
Definition: structs.h:415
BOOL printwrl
Definition: structs.h:485
int nphystags
Definition: globals.h:62
#define LOG_ERROR
Definition: logger.h:24
DOUBLE rho
Definition: structs.h:476
struct solution_struct * solution
Definition: globals.h:52
struct config_t config
Definition: config.h:61
int custombc
Definition: structs.h:523
BOOL pre_calculate_coefs
Definition: structs.h:519
Physical Tags structure.
Definition: structs.h:191
BOOL printout
Definition: structs.h:486
enum SUPPORTED_SOLVERS solver
Definition: structs.h:507
int imimon
Definition: structs.h:461
struct modsol_info * modsolinfo
Definition: globals.h:44
const char * bc_g_file
Definition: structs.h:424
DOUBLE maxsig
Definition: structs.h:478
#define LOG_DEBUG
Definition: logger.h:27
const char * bc_func_file
Definition: structs.h:423
int nradian
Definition: structs.h:452
#define LOG_WARN
Definition: logger.h:25
#define malloc(size)
Definition: allocation.h:38
DOUBLE minome
Definition: structs.h:468
#define MSG_CFG_KROWPRECO0
Definition: messages.h:34
BOOL printvtk
Definition: structs.h:482
double DOUBLE
Definition: types.h:44
BOOL printmsh
Definition: structs.h:483
int iommon
Definition: structs.h:460
long restart
Definition: structs.h:516
int nome
Definition: structs.h:458
BOOL impedentbody
Definition: structs.h:491
struct modcoemic_info * modcoemicinfo
Definition: globals.h:42
const char * imped_file
Definition: structs.h:411
int krow
Definition: structs.h:105
const char * bc_lambda_file
Definition: structs.h:421
int nplanw
Definition: structs.h:454
const char * radiants_file
Definition: structs.h:413
#define MSG_CFG_FREQERROR
Definition: messages.h:31
#define PI
Definition: constants.h:35
#define MAX_PATH
Definition: constants.h:29
const char * sources_file
Definition: structs.h:409
#define CONFIG_GET_FLOAT(config, name, var)
Definition: config.h:44
long maxiterations
Definition: structs.h:513
void logger(int level, char *msg,...)
Definition: logger.c:56
#define calloc(n, size)
Definition: allocation.h:37
struct modgeom_info * modgeominfo
Definition: globals.h:38
BOOL active
Definition: structs.h:438
COMPLEX impedance
Definition: structs.h:495
int file_exists(const char *filename)
Definition: utils.c:48
int dirneu
Definition: structs.h:444