source: issm/trunk/src/c/modules/InputConvergencex/InputConvergencex.cpp@ 4057

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

Diagnostic solution now compiles in parallel! yeehah!

File size: 2.2 KB
RevLine 
[4055]1/*!\file InputConvergencex
2 */
3
4#include "./InputConvergencex.h"
5#include "../../shared/shared.h"
6#include "../../include/include.h"
7#include "../../toolkits/toolkits.h"
8#include "../../EnumDefinitions/EnumDefinitions.h"
9
[4057]10int InputConvergencex(DataSet* elements,DataSet* nodes,DataSet* vertices,DataSet* loads,DataSet* materials,Parameters* parameters,int* enums, int num_enums, int* criterionenums, double* criterionvalues,int num_criterionenums){
[4055]11
12 /*intermediary:*/
13 int i;
14 int converged = 1;
15 int node_converged=1;
16 double *eps = NULL;
17 extern int my_rank;
18 int rank_allowed;
[4057]19 Element* element=NULL;
20 int verbose=0;
[4055]21
22 /*First, configure our datasets: */
23 elements->Configure(elements,loads, nodes,vertices, materials,parameters);
24 nodes-> Configure(elements,loads, nodes,vertices, materials,parameters);
25 loads-> Configure(elements, loads, nodes,vertices, materials,parameters);
26 parameters->Configure(elements,loads, nodes,vertices, materials,parameters);
27
[4057]28 /*retrieve parameters: */
29 parameters->FindParam(&verbose,VerboseEnum);
30
[4055]31 /*allocate dynamic memory: */
32 eps=(double*)xmalloc(num_criterionenums*sizeof(double));
33
34 /*Go through elements, and ask them to do the job: */
35 for(i=0;i<elements->Size();i++){
[4057]36 element=(Element*)elements->GetObjectByOffset(i);
[4055]37 element->InputConvergence(&converged,eps,enums,num_enums,criterionenums,criterionvalues,num_criterionenums);
38 if(!converged)break;
39 }
40
41 if(!converged){
42 /*get convergence information to user: */
43 if(verbose>2)rank_allowed=my_rank;
44 else rank_allowed=0;
45 if(my_rank==rank_allowed){
46 printf("%s%i%s"," non convergence on element ",element->Id()," for inputs ("); for(i=0;i<num_enums-1;i++)printf("%s,",EnumAsString(enums[i])); printf("%s) ",EnumAsString(enums[num_enums-1]));
47 printf("criterions: "); for(i=0;i<num_criterionenums;i++)printf("%s: %g/%g ",EnumAsString(criterionenums[i]),eps[i],criterionvalues[i]);
48 }
49 }
50
51 /*In parallel, we need to gather the converged status: */
52 #ifdef _PARALLEL_
53 MPI_Reduce (&converged,&node_converged,1,MPI_INT,MPI_MIN,0,MPI_COMM_WORLD );
54 MPI_Bcast(&node_converged,1,MPI_INT,0,MPI_COMM_WORLD);
55 converged=node_converged;
56 #endif
57
58 /*Free ressources:*/
59 xfree((void**)&eps);
60
61 /*return: */
62 return converged;
63}
Note: See TracBrowser for help on using the repository browser.