Trilinos based (stochastic) FEM solvers
main.cpp
Go to the documentation of this file.
1 /*
2 Brian Staber (brian.staber@gmail.com)
3 */
4 
5 #include "Epetra_ConfigDefs.h"
6 #ifdef HAVE_MPI
7 #include "mpi.h"
8 #include "Epetra_MpiComm.h"
9 #else
10 #include "Epetra_SerialComm.h"
11 #endif
12 
13 #include "Teuchos_CommandLineProcessor.hpp"
14 #include "Teuchos_StandardCatchMacros.hpp"
15 #include "Teuchos_ParameterList.hpp"
16 #include "Teuchos_XMLParameterListCoreHelpers.hpp"
17 
19 
20 int main(int argc, char *argv[]){
21 
22  std::string xmlInFileName = "";
23 
24  Teuchos::CommandLineProcessor clp(false);
25  clp.setOption("xml-in-file",&xmlInFileName,"The XML file to read into a parameter list");
26  clp.setDocString("TO DO.");
27 
28  Teuchos::CommandLineProcessor::EParseCommandLineReturn
29  parse_return = clp.parse(argc,argv);
30  if( parse_return != Teuchos::CommandLineProcessor::PARSE_SUCCESSFUL ) {
31  std::cout << "\nEnd Result: TEST FAILED" << std::endl;
32  return parse_return;
33  }
34 
35 #ifdef HAVE_MPI
36  MPI_Init(&argc, &argv);
37  Epetra_MpiComm Comm(MPI_COMM_WORLD);
38 #else
39  Epetra_SerialComm Comm;
40 #endif
41 
42  Teuchos::RCP<Teuchos::ParameterList> paramList = Teuchos::rcp(new Teuchos::ParameterList);
43  if(xmlInFileName.length()) {
44  Teuchos::updateParametersFromXmlFile(xmlInFileName, inoutArg(*paramList));
45  }
46 
47  if (Comm.MyPID()==0){
48  paramList->print(std::cout,2,true,true);
49  }
50 
51  Teuchos::RCP<tiMooneyRandomField> interface = Teuchos::rcp(new tiMooneyRandomField(Comm,*paramList));
52 
53  Epetra_SerialDenseVector mean_parameters(5);
54  mean_parameters(0) = Teuchos::getParameter<double>(paramList->sublist("TIMooney"),"mu1");
55  mean_parameters(1) = Teuchos::getParameter<double>(paramList->sublist("TIMooney"),"mu2");
56  mean_parameters(2) = Teuchos::getParameter<double>(paramList->sublist("TIMooney"),"mu3");
57  mean_parameters(3) = Teuchos::getParameter<double>(paramList->sublist("TIMooney"),"mu4");
58  mean_parameters(4) = Teuchos::getParameter<double>(paramList->sublist("TIMooney"),"mu5");
59 
60  Epetra_SerialDenseVector exponents(2);
61  exponents(0) = Teuchos::getParameter<double>(paramList->sublist("TIMooney"),"beta4");
62  exponents(1) = Teuchos::getParameter<double>(paramList->sublist("TIMooney"),"beta5");
63 
64  Epetra_SerialDenseVector correlation_lengths(2);
65  correlation_lengths(0) = Teuchos::getParameter<double>(paramList->sublist("Shinozuka"),"lx");
66  correlation_lengths(1) = Teuchos::getParameter<double>(paramList->sublist("Shinozuka"),"ly");
67 
68  Epetra_SerialDenseVector coeff_of_variation(4);
69  coeff_of_variation(0) = Teuchos::getParameter<double>(paramList->sublist("Shinozuka"),"delta1");
70  coeff_of_variation(1) = Teuchos::getParameter<double>(paramList->sublist("Shinozuka"),"delta2");
71  coeff_of_variation(2) = Teuchos::getParameter<double>(paramList->sublist("Shinozuka"),"delta3");
72  coeff_of_variation(3) = Teuchos::getParameter<double>(paramList->sublist("Shinozuka"),"delta4");
73 
74  Epetra_SerialDenseVector plyagls(4);
75  plyagls(0) = 15.0;
76  plyagls(1) = 30.0;
77  plyagls(2) = 60.0;
78  plyagls(3) = 75.0;
79 
80  Epetra_SerialDenseVector omega(6);
81  omega(0) = coeff_of_variation(0);
82  omega(1) = coeff_of_variation(1);
83  omega(2) = coeff_of_variation(2);
84  omega(3) = coeff_of_variation(3);
85  omega(4) = correlation_lengths(0);
86  omega(5) = correlation_lengths(1);
87 
88  double plyagl = plyagls(0)*2.0*M_PI/360.0;
89  interface->setParameters(mean_parameters,exponents,omega);
90  interface->set_plyagl(plyagl);
91 
92  Epetra_IntSerialDenseVector seeds(5);
93  seeds(0) = 5*(11+0*100)+0;
94  seeds(1) = 5*(11+0*100)+1;
95  seeds(2) = 5*(11+0*100)+2;
96  seeds(3) = 5*(11+0*100)+3;
97  seeds(4) = 5*(11+0*100)+4;
98  interface->RandomFieldGenerator(seeds);
99 
100  int e_gid;
101  int n_local_cells = interface->Mesh->n_local_cells;
102  int n_gauss_cells = interface->Mesh->n_gauss_cells;
103  std::vector<int> local_gauss_points(n_local_cells*n_gauss_cells);
104  for (unsigned int e_lid=0; e_lid<n_local_cells; ++e_lid){
105  e_gid = interface->Mesh->local_cells[e_lid];
106  for (unsigned int gp=0; gp<n_gauss_cells; ++gp){
107  local_gauss_points[e_lid*n_gauss_cells+gp] = e_gid*n_gauss_cells+gp;
108  }
109 
110  }
111  Epetra_Map GaussMap(-1,n_local_cells*n_gauss_cells,&local_gauss_points[0],0,Comm);
112 
113  Epetra_Vector mu1_gmrf(GaussMap);
114  Epetra_Vector mu2_gmrf(GaussMap);
115  Epetra_Vector mu3_gmrf(GaussMap);
116  Epetra_Vector mu4_gmrf(GaussMap);
117  Epetra_Vector mu5_gmrf(GaussMap);
118  Epetra_Vector x_coord(GaussMap);
119  Epetra_Vector y_coord(GaussMap);
120  Epetra_Vector z_coord(GaussMap);
121 
122  int node;
123  double xi, eta, zeta;
124  Epetra_SerialDenseMatrix matrix_X(3,interface->Mesh->el_type);
125  Epetra_SerialDenseVector vector_X(3);
126  Epetra_SerialDenseVector N(interface->Mesh->el_type);
127 
128  for (unsigned int e_lid=0; e_lid<n_local_cells; ++e_lid){
129  e_gid = interface->Mesh->local_cells[e_lid];
130  for (int inode=0; inode<interface->Mesh->el_type; ++inode){
131  node = interface->Mesh->cells_nodes[interface->Mesh->el_type*e_gid+inode];
132  matrix_X(0,inode) = interface->Mesh->nodes_coord[3*node+0];
133  matrix_X(1,inode) = interface->Mesh->nodes_coord[3*node+1];
134  matrix_X(2,inode) = interface->Mesh->nodes_coord[3*node+2];
135  }
136  for (unsigned int gp=0; gp<n_gauss_cells; ++gp){
137  xi = interface->Mesh->xi_cells[gp];
138  eta = interface->Mesh->eta_cells[gp];
139  zeta = interface->Mesh->zeta_cells[gp];
140  hexa8::shape_functions(N,xi,eta,zeta);
141 
142  vector_X.Multiply('N','N',1.0,matrix_X,N,0.0);
143  interface->get_material_parameters(e_lid,gp);
144 
145  mu1_gmrf[GaussMap.LID(int(e_gid*n_gauss_cells+gp))] = interface->mu1;
146  mu2_gmrf[GaussMap.LID(int(e_gid*n_gauss_cells+gp))] = interface->mu2;
147  mu3_gmrf[GaussMap.LID(int(e_gid*n_gauss_cells+gp))] = interface->mu3;
148  mu4_gmrf[GaussMap.LID(int(e_gid*n_gauss_cells+gp))] = interface->mu4;
149  mu5_gmrf[GaussMap.LID(int(e_gid*n_gauss_cells+gp))] = interface->mu5;
150 
151  x_coord[GaussMap.LID(int(e_gid*n_gauss_cells+gp))] = vector_X(0);
152  y_coord[GaussMap.LID(int(e_gid*n_gauss_cells+gp))] = vector_X(1);
153  z_coord[GaussMap.LID(int(e_gid*n_gauss_cells+gp))] = vector_X(2);
154  }
155  }
156 
157  int error;
158  int NumTargetElements = 0;
159  if (Comm.MyPID()==0){
160  NumTargetElements = interface->Mesh->n_cells*n_gauss_cells;
161  }
162  Epetra_Map MapOnRoot(-1,NumTargetElements,0,Comm);
163  Epetra_Export ExportOnRoot(GaussMap,MapOnRoot);
164  Epetra_MultiVector lhs_root(MapOnRoot,true);
165 
166  lhs_root.Export(mu1_gmrf,ExportOnRoot,Insert);
167  std::string filename = "/home/s/staber/Trilinos_results/nrl/randomfields/mu1_gmrf.mtx";
168  error = EpetraExt::MultiVectorToMatrixMarketFile(filename.c_str(),lhs_root,0,0,false);
169 
170  lhs_root.PutScalar(0.0);
171  lhs_root.Export(mu2_gmrf,ExportOnRoot,Insert);
172  filename = "/home/s/staber/Trilinos_results/nrl/randomfields/mu2_gmrf.mtx";
173  error = EpetraExt::MultiVectorToMatrixMarketFile(filename.c_str(),lhs_root,0,0,false);
174 
175  lhs_root.PutScalar(0.0);
176  lhs_root.Export(mu3_gmrf,ExportOnRoot,Insert);
177  filename = "/home/s/staber/Trilinos_results/nrl/randomfields/mu3_gmrf.mtx";
178  error = EpetraExt::MultiVectorToMatrixMarketFile(filename.c_str(),lhs_root,0,0,false);
179 
180  lhs_root.PutScalar(0.0);
181  lhs_root.Export(mu4_gmrf,ExportOnRoot,Insert);
182  filename = "/home/s/staber/Trilinos_results/nrl/randomfields/mu4_gmrf.mtx";
183  error = EpetraExt::MultiVectorToMatrixMarketFile(filename.c_str(),lhs_root,0,0,false);
184 
185  lhs_root.PutScalar(0.0);
186  lhs_root.Export(mu5_gmrf,ExportOnRoot,Insert);
187  filename = "/home/s/staber/Trilinos_results/nrl/randomfields/mu5_gmrf.mtx";
188  error = EpetraExt::MultiVectorToMatrixMarketFile(filename.c_str(),lhs_root,0,0,false);
189 
190  lhs_root.PutScalar(0.0);
191  lhs_root.Export(x_coord,ExportOnRoot,Insert);
192  filename = "/home/s/staber/Trilinos_results/nrl/randomfields/x_coord.mtx";
193  error = EpetraExt::MultiVectorToMatrixMarketFile(filename.c_str(),lhs_root,0,0,false);
194 
195  lhs_root.PutScalar(0.0);
196  lhs_root.Export(y_coord,ExportOnRoot,Insert);
197  filename = "/home/s/staber/Trilinos_results/nrl/randomfields/y_coord.mtx";
198  error = EpetraExt::MultiVectorToMatrixMarketFile(filename.c_str(),lhs_root,0,0,false);
199 
200  lhs_root.PutScalar(0.0);
201  lhs_root.Export(z_coord,ExportOnRoot,Insert);
202  filename = "/home/s/staber/Trilinos_results/nrl/randomfields/z_coord.mtx";
203  error = EpetraExt::MultiVectorToMatrixMarketFile(filename.c_str(),lhs_root,0,0,false);
204 
205 #ifdef HAVE_MPI
206  MPI_Finalize();
207 #endif
208  return 0;
209 
210 }
void shape_functions(Epetra_SerialDenseVector &N, double &xi, double &eta, double &zeta)
Definition: fepp.cpp:88
filename
Definition: costFunction.m:44
int main(int argc, char *argv[])
Definition: main.cpp:23
output eta
Definition: costFunction.m:33