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

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

Optimized configuration. Only needed in series, or in parallel when resetting
configuration in SetConfiguration in FemModel.
Still more to optimize, but this takes a lot of code away.

File size: 1.9 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
[4218]10int InputConvergencex(Elements* elements,Nodes* nodes,Vertices* vertices,Loads* loads,Materials* 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
[4057]22 /*retrieve parameters: */
23 parameters->FindParam(&verbose,VerboseEnum);
24
[4055]25 /*allocate dynamic memory: */
26 eps=(double*)xmalloc(num_criterionenums*sizeof(double));
27
28 /*Go through elements, and ask them to do the job: */
29 for(i=0;i<elements->Size();i++){
[4057]30 element=(Element*)elements->GetObjectByOffset(i);
[4055]31 element->InputConvergence(&converged,eps,enums,num_enums,criterionenums,criterionvalues,num_criterionenums);
32 if(!converged)break;
33 }
34
35 if(!converged){
36 /*get convergence information to user: */
37 if(verbose>2)rank_allowed=my_rank;
38 else rank_allowed=0;
39 if(my_rank==rank_allowed){
40 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]));
41 printf("criterions: "); for(i=0;i<num_criterionenums;i++)printf("%s: %g/%g ",EnumAsString(criterionenums[i]),eps[i],criterionvalues[i]);
42 }
43 }
44
45 /*In parallel, we need to gather the converged status: */
46 #ifdef _PARALLEL_
47 MPI_Reduce (&converged,&node_converged,1,MPI_INT,MPI_MIN,0,MPI_COMM_WORLD );
48 MPI_Bcast(&node_converged,1,MPI_INT,0,MPI_COMM_WORLD);
49 converged=node_converged;
50 #endif
51
52 /*Free ressources:*/
53 xfree((void**)&eps);
54
55 /*return: */
56 return converged;
57}
Note: See TracBrowser for help on using the repository browser.