00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00025
00026
00027
00028
00029
00030
00031
00032
00033
00034
00035
00036
00037
00038
00039 #include <FEM_ObjectBroker.h>
00040
00041
00042 #include <CTestNormUnbalance.h>
00043 #include <CTestNormDispIncr.h>
00044 #include <CTestEnergyIncr.h>
00045
00046
00047 #include <RCM.h>
00048 #include <MyRCM.h>
00049 #include <SimpleNumberer.h>
00050
00051
00052 #include <ElasticMaterial.h>
00053 #include <ElasticPPMaterial.h>
00054 #include <ParallelMaterial.h>
00055 #include <Concrete01.h>
00056 #include <Steel01.h>
00057 #include <HardeningMaterial.h>
00058 #include <HystereticMaterial.h>
00059 #include <EPPGapMaterial.h>
00060 #include <ViscousMaterial.h>
00061 #include <PathIndependentMaterial.h>
00062 #include <SeriesMaterial.h>
00063 #include <CableMaterial.h>
00064
00065
00066 #include <ElasticSection2d.h>
00067 #include <ElasticSection3d.h>
00068 #include <GenericSection1d.h>
00069 #include <GenericSectionNd.h>
00070 #include <SectionAggregator.h>
00071 #include <FiberSection.h>
00072 #include <FiberSection2d.h>
00073 #include <FiberSection3d.h>
00074
00075
00076 #include <ElasticIsotropicPlaneStrain2D.h>
00077 #include <ElasticIsotropicPlaneStress2D.h>
00078
00079
00080 #include <UniaxialFiber2d.h>
00081 #include <UniaxialFiber3d.h>
00082
00083
00084 #include <Element.h>
00085 #include <beam2d02.h>
00086 #include <beam2d03.h>
00087 #include <beam2d04.h>
00088 #include <beam3d01.h>
00089 #include <beam3d02.h>
00090 #include <Truss.h>
00091 #include <TrussSection.h>
00092 #include <ZeroLength.h>
00093 #include <ZeroLengthSection.h>
00094 #include <ZeroLengthND.h>
00095 #include <FourNodeQuad.h>
00096 #include <ElasticBeam2d.h>
00097 #include <ElasticBeam3d.h>
00098 #include <BeamWithHinges2d.h>
00099 #include <BeamWithHinges3d.h>
00100 #include <NLBeamColumn2d.h>
00101 #include <NLBeamColumn3d.h>
00102
00103 #include <LinearCrdTransf2d.h>
00104 #include <PDeltaCrdTransf2d.h>
00105 #include <LinearCrdTransf3d.h>
00106
00107
00108 #include <Node.h>
00109
00110
00111 #include <MP_Constraint.h>
00112
00113
00114 #include <SP_Constraint.h>
00115
00116
00117 #include <NodalLoad.h>
00118
00119
00120 #include <ElementalLoad.h>
00121
00122
00123 #include <Matrix.h>
00124 #include <Vector.h>
00125 #include <ID.h>
00126
00127
00128 #include <Subdomain.h>
00129
00130
00131 #include <ConstraintHandler.h>
00132 #include <PlainHandler.h>
00133
00134
00135 #include <DOF_Numberer.h>
00136 #include <PlainNumberer.h>
00137
00138
00139 #include <AnalysisModel.h>
00140
00141
00142 #include <EquiSolnAlgo.h>
00143 #include <Linear.h>
00144 #include <NewtonRaphson.h>
00145 #include <ModifiedNewton.h>
00146
00147
00148 #include <DomainDecompAlgo.h>
00149
00150
00151 #include <LoadControl.h>
00152 #include <ArcLength.h>
00153 #include <TransientIntegrator.h>
00154 #include <Newmark.h>
00155
00156
00157 #include <LinearSOE.h>
00158 #include <DomainSolver.h>
00159 #include <FullGenLinSOE.h>
00160 #include <FullGenLinLapackSolver.h>
00161 #include <BandGenLinSOE.h>
00162 #include <BandGenLinLapackSolver.h>
00163 #include <BandSPDLinSOE.h>
00164 #include <BandSPDLinLapackSolver.h>
00165 #include <ProfileSPDLinSOE.h>
00166 #include <ProfileSPDLinDirectSolver.h>
00167 #include <ProfileSPDLinSubstrSolver.h>
00168
00169
00170 #include <DomainDecompositionAnalysis.h>
00171
00172
00173 #include <LoadPattern.h>
00174 #include <GroundMotion.h>
00175
00176
00177 #include <LinearSeries.h>
00178 #include <PathSeries.h>
00179 #include <PathTimeSeries.h>
00180 #include <RectangularSeries.h>
00181 #include <ConstantSeries.h>
00182 #include <TrigSeries.h>
00183
00184 FEM_ObjectBroker::FEM_ObjectBroker()
00185 :lastLinearSolver(0),lastDomainSolver(0)
00186 {
00187
00188 }
00189
00190
00191 FEM_ObjectBroker::~FEM_ObjectBroker()
00192 {
00193
00194 }
00195
00196
00197
00198 PartitionedModelBuilder *
00199 FEM_ObjectBroker::getPtrNewPartitionedModelBuilder(Subdomain &theSubdomain,
00200 int classTag)
00201 {
00202 switch(classTag) {
00203
00204
00205
00206
00207
00208 default:
00209 cerr << "FEM_ObjectBroker::getPtrNewPartitionedModelBuilder - ";
00210 cerr << " - no PartitionedModelBuilder type exists for class tag ";
00211 cerr << classTag << endl;
00212 return 0;
00213
00214 }
00215 }
00216
00217
00218 GraphNumberer *
00219 FEM_ObjectBroker::getPtrNewGraphNumberer(int classTag)
00220 {
00221 switch(classTag) {
00222 case GraphNUMBERER_TAG_RCM:
00223 return new RCM();
00224
00225
00226 case GraphNUMBERER_TAG_MyRCM:
00227 return new MyRCM();
00228
00229
00230 case GraphNUMBERER_TAG_SimpleNumberer:
00231 return new SimpleNumberer();
00232
00233
00234 default:
00235 cerr << "ObjectBroker::getPtrNewGraphNumberer - ";
00236 cerr << " - no GraphNumberer type exists for class tag " ;
00237 cerr << classTag << endl;
00238 return 0;
00239
00240 }
00241 }
00242
00243
00244
00245
00246
00247
00248
00249
00250
00251
00252
00253
00254
00255
00256 Element *
00257 FEM_ObjectBroker::getNewElement(int classTag)
00258 {
00259 switch(classTag) {
00260
00261 case ELE_TAG_Truss:
00262 return new Truss();
00263
00264 case ELE_TAG_TrussSection:
00265 return new TrussSection();
00266
00267 case ELE_TAG_ZeroLength:
00268 return new ZeroLength();
00269
00270 case ELE_TAG_ZeroLengthSection:
00271 return new ZeroLengthSection();
00272
00273 case ELE_TAG_ZeroLengthND:
00274 return new ZeroLengthND();
00275
00276 case ELE_TAG_FourNodeQuad:
00277 return new FourNodeQuad();
00278
00279 case ELE_TAG_ElasticBeam2d:
00280 return new ElasticBeam2d();
00281
00282 case ELE_TAG_ElasticBeam3d:
00283 return new ElasticBeam3d();
00284
00285 case ELE_TAG_BeamWithHinges2d:
00286 return new BeamWithHinges2d();
00287
00288 case ELE_TAG_BeamWithHinges3d:
00289 return new BeamWithHinges3d();
00290
00291 case ELE_TAG_NLBeamColumn2d:
00292 return new NLBeamColumn2d();
00293
00294 case ELE_TAG_NLBeamColumn3d:
00295 return new NLBeamColumn3d();
00296
00297 default:
00298 cerr << "FEM_ObjectBroker::getNewElement - ";
00299 cerr << " - no Element type exists for class tag " ;
00300 cerr << classTag << endl;
00301 return 0;
00302
00303 }
00304 }
00305
00306 Node *
00307 FEM_ObjectBroker::getNewNode(int classTag)
00308 {
00309 switch(classTag) {
00310 case NOD_TAG_Node:
00311 return new Node(classTag);
00312
00313
00314 default:
00315 cerr << "FEM_ObjectBroker::getNewNode - ";
00316 cerr << " - no Node type exists for class tag ";
00317 cerr << classTag << endl;
00318 return 0;
00319
00320 }
00321 }
00322
00323
00324 MP_Constraint *
00325 FEM_ObjectBroker::getNewMP(int classTag)
00326 {
00327 switch(classTag) {
00328 case CNSTRNT_TAG_MP_Constraint:
00329 return new MP_Constraint(classTag);
00330
00331
00332 default:
00333 cerr << "FEM_ObjectBroker::getNewMP - ";
00334 cerr << " - no SP_Constraint type exists for class tag ";
00335 cerr << classTag << endl;
00336 return 0;
00337
00338 }
00339 }
00340
00341
00342 SP_Constraint *
00343 FEM_ObjectBroker::getNewSP(int classTag)
00344 {
00345 switch(classTag) {
00346 case CNSTRNT_TAG_SP_Constraint:
00347 return new SP_Constraint(classTag);
00348
00349
00350 default:
00351 cerr << "FEM_ObjectBroker::getNewSP - ";
00352 cerr << " - no SP_Constraint type exists for class tag ";
00353 cerr << classTag << endl;
00354 return 0;
00355
00356 }
00357 }
00358
00359 NodalLoad *
00360 FEM_ObjectBroker::getNewNodalLoad(int classTag)
00361 {
00362 switch(classTag) {
00363 case LOAD_TAG_NodalLoad:
00364 return new NodalLoad(classTag);
00365
00366
00367 default:
00368 cerr << "FEM_ObjectBroker::getNewNodalLoad - ";
00369 cerr << " - no NodalLoad type exists for class tag ";
00370 cerr << classTag << endl;
00371 return 0;
00372
00373 }
00374 }
00375
00376
00377 ElementalLoad *
00378 FEM_ObjectBroker::getNewElementalLoad(int classTag)
00379 {
00380 cerr << "FEM_ObjectBroker: NOT IMPLEMENTED YET";
00381 return 0;
00382 }
00383
00384 CrdTransf2d*
00385 FEM_ObjectBroker::getNewCrdTransf2d(int classTag)
00386 {
00387 switch(classTag) {
00388 case CRDTR_TAG_LinearCrdTransf2d:
00389 return new LinearCrdTransf2d();
00390 case CRDTR_TAG_PDeltaCrdTransf2d:
00391 return new PDeltaCrdTransf2d();
00392
00393
00394 default:
00395 cerr << "FEM_ObjectBroker::getPtrNewCrdTransf2d - ";
00396 cerr << " - no CrdTransf2d type exists for class tag ";
00397 cerr << classTag << endl;
00398 return 0;
00399 }
00400
00401 }
00402
00403 CrdTransf3d*
00404 FEM_ObjectBroker::getNewCrdTransf3d(int classTag)
00405 {
00406 switch(classTag) {
00407 case CRDTR_TAG_LinearCrdTransf3d:
00408 return new LinearCrdTransf3d();
00409
00410
00411 default:
00412 cerr << "FEM_ObjectBroker::getPtrNewCrdTransf3d - ";
00413 cerr << " - no CrdTransf3d type exists for class tag ";
00414 cerr << classTag << endl;
00415 return 0;
00416 }
00417
00418 }
00419
00420 UniaxialMaterial *
00421 FEM_ObjectBroker::getNewUniaxialMaterial(int classTag)
00422 {
00423 switch(classTag) {
00424 case MAT_TAG_ElasticMaterial:
00425 return new ElasticMaterial();
00426
00427 case MAT_TAG_ElasticPPMaterial:
00428 return new ElasticPPMaterial();
00429
00430 case MAT_TAG_ParallelMaterial:
00431 return new ParallelMaterial();
00432
00433 case MAT_TAG_Concrete01:
00434 return new Concrete01();
00435
00436 case MAT_TAG_Steel01:
00437 return new Steel01();
00438
00439 case MAT_TAG_Hardening:
00440 return new HardeningMaterial();
00441
00442 case MAT_TAG_Hysteretic:
00443 return new HystereticMaterial();
00444
00445 case MAT_TAG_EPPGap:
00446 return new EPPGapMaterial();
00447
00448 case MAT_TAG_Viscous:
00449 return new ViscousMaterial();
00450
00451 case MAT_TAG_PathIndependent:
00452 return new PathIndependentMaterial();
00453
00454 case MAT_TAG_SeriesMaterial:
00455 return new SeriesMaterial();
00456
00457 case MAT_TAG_CableMaterial:
00458 return new CableMaterial();
00459
00460 default:
00461 cerr << "FEM_ObjectBroker::getPtrNewUniaxialMaterial - ";
00462 cerr << " - no UniaxialMaterial type exists for class tag ";
00463 cerr << classTag << endl;
00464 return 0;
00465
00466 }
00467 }
00468
00469 SectionForceDeformation *
00470 FEM_ObjectBroker::getNewSection(int classTag)
00471 {
00472 switch(classTag) {
00473 case SEC_TAG_Elastic2d:
00474 return new ElasticSection2d();
00475
00476 case SEC_TAG_Elastic3d:
00477 return new ElasticSection3d();
00478
00479 case SEC_TAG_Generic1d:
00480 return new GenericSection1d();
00481
00482 case SEC_TAG_GenericNd:
00483 return new GenericSectionNd();
00484
00485 case SEC_TAG_Aggregator:
00486 return new SectionAggregator();
00487
00488 case SEC_TAG_Fiber:
00489 return new FiberSection();
00490
00491 case SEC_TAG_FiberSection2d:
00492 return new FiberSection2d();
00493
00494 case SEC_TAG_FiberSection3d:
00495 return new FiberSection3d();
00496
00497 default:
00498 cerr << "FEM_ObjectBroker::getNewSection - ";
00499 cerr << " - no section type exists for class tag ";
00500 cerr << classTag << endl;
00501 return 0;
00502
00503 }
00504 }
00505
00506 NDMaterial*
00507 FEM_ObjectBroker::getNewNDMaterial(int classTag)
00508 {
00509 switch(classTag) {
00510 case ND_TAG_ElasticIsotropicPlaneStrain2d:
00511 return new ElasticIsotropicPlaneStrain2D();
00512
00513 case ND_TAG_ElasticIsotropicPlaneStress2d:
00514 return new ElasticIsotropicPlaneStress2D();
00515
00516 default:
00517 cerr << "FEM_ObjectBroker::getNewNDMaterial - ";
00518 cerr << " - no NDMaterial type exists for class tag ";
00519 cerr << classTag << endl;
00520 return 0;
00521 }
00522 }
00523
00524 Fiber*
00525 FEM_ObjectBroker::getNewFiber(int classTag)
00526 {
00527 switch(classTag) {
00528 case FIBER_TAG_Uniaxial2d:
00529 return new UniaxialFiber2d();
00530
00531 case FIBER_TAG_Uniaxial3d:
00532 return new UniaxialFiber3d();
00533
00534 default:
00535 cerr << "FEM_ObjectBroker::getNewFiber - ";
00536 cerr << " - no Fiber type exists for class tag ";
00537 cerr << classTag << endl;
00538 return 0;
00539 }
00540 }
00541
00542 ConvergenceTest *
00543 FEM_ObjectBroker::getNewConvergenceTest(int classTag)
00544 {
00545 switch(classTag) {
00546 case CONVERGENCE_TEST_CTestNormUnbalance:
00547 return new CTestNormUnbalance();
00548
00549 case CONVERGENCE_TEST_CTestNormDispIncr:
00550 return new CTestNormDispIncr();
00551
00552 case CONVERGENCE_TEST_CTestEnergyIncr:
00553 return new CTestEnergyIncr();
00554
00555
00556 default:
00557 cerr << "FEM_ObjectBroker::getPtrNewConvergenceTest - ";
00558 cerr << " - no ConvergenceTest type exists for class tag ";
00559 cerr << classTag << endl;
00560 return 0;
00561
00562 }
00563 }
00564
00565
00566 LoadPattern *
00567 FEM_ObjectBroker::getNewLoadPattern(int classTag)
00568 {
00569 switch(classTag) {
00570 case PATTERN_TAG_LoadPattern:
00571 return new LoadPattern();
00572
00573 default:
00574 cerr << "FEM_ObjectBroker::getPtrLoadPattern - ";
00575 cerr << " - no Load type exists for class tag ";
00576 cerr << classTag << endl;
00577 return 0;
00578
00579 }
00580 }
00581
00582
00583 GroundMotion *
00584 FEM_ObjectBroker::getNewGroundMotion(int classTag)
00585 {
00586 switch(classTag) {
00587 default:
00588 cerr << "FEM_ObjectBroker::getPtrGroundMotion - ";
00589 cerr << " - no Load type exists for class tag ";
00590 cerr << classTag << endl;
00591 return 0;
00592
00593 }
00594 }
00595
00596 TimeSeries *
00597 FEM_ObjectBroker::getNewTimeSeries(int classTag)
00598 {
00599 switch(classTag) {
00600 case TSERIES_TAG_LinearSeries:
00601 return new LinearSeries;
00602
00603 case TSERIES_TAG_RectangularSeries:
00604 return new RectangularSeries;
00605
00606 case TSERIES_TAG_PathTimeSeries:
00607 return new PathTimeSeries;
00608
00609 case TSERIES_TAG_PathSeries:
00610 return new PathSeries;
00611
00612 case TSERIES_TAG_ConstantSeries:
00613 return new ConstantSeries;
00614
00615 case TSERIES_TAG_TrigSeries:
00616 return new TrigSeries;
00617
00618 default:
00619 cerr << "FEM_ObjectBroker::getPtrTimeSeries - ";
00620 cerr << " - no Load type exists for class tag ";
00621 cerr << classTag << endl;
00622 return 0;
00623
00624 }
00625 }
00626
00627
00628 Matrix *
00629 FEM_ObjectBroker::getPtrNewMatrix(int classTag, int noRows, int noCols)
00630 {
00631 switch(classTag) {
00632 case MATRIX_TAG_Matrix:
00633 return new Matrix(noRows,noCols);
00634
00635
00636 default:
00637 cerr << "FEM_ObjectBroker::getPtrNewMatrix - ";
00638 cerr << " - no NodalLoad type exists for class tag ";
00639 cerr << classTag << endl;
00640 return 0;
00641
00642 }
00643 }
00644
00645
00646 Vector *
00647 FEM_ObjectBroker::getPtrNewVector(int classTag, int size)
00648 {
00649 switch(classTag) {
00650 case VECTOR_TAG_Vector:
00651 return new Vector(size);
00652
00653
00654 default:
00655 cerr << "FEM_ObjectBroker::getPtrNewVector - ";
00656 cerr << " - no Vector type exists for class tag ";
00657 cerr << classTag << endl;
00658 return 0;
00659
00660 }
00661 }
00662
00663
00664 ID *
00665 FEM_ObjectBroker::getPtrNewID(int classTag, int size)
00666 {
00667 switch(classTag) {
00668 case ID_TAG_ID:
00669 return new ID(size);
00670
00671
00672 default:
00673 cerr << "FEM_ObjectBroker::getPtrNewID - ";
00674 cerr << " - no ID type exists for class tag ";
00675 cerr << classTag << endl;
00676 return 0;
00677
00678 }
00679 }
00680
00681
00682
00683
00684
00685
00686
00687
00688
00689 ConstraintHandler *
00690 FEM_ObjectBroker::getNewConstraintHandler(int classTag)
00691 {
00692 switch(classTag) {
00693 case HANDLER_TAG_PlainHandler:
00694 return new PlainHandler();
00695
00696
00697 default:
00698 cerr << "FEM_ObjectBroker::getNewConstraintHandler - ";
00699 cerr << " - no ConstraintHandler type exists for class tag ";
00700 cerr << classTag << endl;
00701 return 0;
00702
00703 }
00704 }
00705
00706
00707 DOF_Numberer *
00708 FEM_ObjectBroker::getNewNumberer(int classTag)
00709 {
00710 switch(classTag) {
00711 case NUMBERER_TAG_DOF_Numberer:
00712 return new DOF_Numberer();
00713
00714
00715 case NUMBERER_TAG_PlainNumberer:
00716 return new PlainNumberer();
00717
00718
00719 default:
00720 cerr << "FEM_ObjectBroker::getNewConstraintHandler - ";
00721 cerr << " - no ConstraintHandler type exists for class tag ";
00722 cerr << classTag << endl;
00723 return 0;
00724
00725 }
00726 }
00727
00728
00729 AnalysisModel *
00730 FEM_ObjectBroker::getNewAnalysisModel(int classTag)
00731 {
00732 switch(classTag) {
00733 case AnaMODEL_TAGS_AnalysisModel:
00734 return new AnalysisModel();
00735
00736
00737 default:
00738 cerr << "FEM_ObjectBroker::getNewAnalysisModel - ";
00739 cerr << " - no AnalysisModel type exists for class tag ";
00740 cerr << classTag << endl;
00741 return 0;
00742
00743 }
00744 }
00745
00746
00747 EquiSolnAlgo *
00748 FEM_ObjectBroker::getNewEquiSolnAlgo(int classTag)
00749 {
00750 switch(classTag) {
00751 case EquiALGORITHM_TAGS_Linear:
00752 return new Linear();
00753
00754
00755 case EquiALGORITHM_TAGS_NewtonRaphson:
00756 return new NewtonRaphson();
00757
00758
00759 case EquiALGORITHM_TAGS_ModifiedNewton:
00760 return new ModifiedNewton();
00761
00762
00763 default:
00764 cerr << "FEM_ObjectBroker::getNewEquiSolnAlgo - ";
00765 cerr << " - no EquiSolnAlgo type exists for class tag ";
00766 cerr << classTag << endl;
00767 return 0;
00768
00769 }
00770 }
00771
00772
00773 DomainDecompAlgo *
00774 FEM_ObjectBroker::getNewDomainDecompAlgo(int classTag)
00775 {
00776 switch(classTag) {
00777 case DomDecompALGORITHM_TAGS_DomainDecompAlgo:
00778 return new DomainDecompAlgo();
00779
00780
00781 default:
00782 cerr << "FEM_ObjectBroker::getNewDomainDecompAlgo - ";
00783 cerr << " - no DomainDecompAlgo type exists for class tag ";
00784 cerr << classTag << endl;
00785 return 0;
00786
00787 }
00788 }
00789
00790
00791 StaticIntegrator *
00792 FEM_ObjectBroker::getNewStaticIntegrator(int classTag)
00793 {
00794 switch(classTag) {
00795 case INTEGRATOR_TAGS_LoadControl:
00796 return new LoadControl(1.0,1.0,1.0,.10);
00797
00798
00799 case INTEGRATOR_TAGS_ArcLength:
00800 return new ArcLength(1.0);
00801
00802
00803 default:
00804 cerr << "FEM_ObjectBroker::getNewStaticIntegrator - ";
00805 cerr << " - no StaticIntegrator type exists for class tag ";
00806 cerr << classTag << endl;
00807 return 0;
00808
00809 }
00810 }
00811
00812
00813 TransientIntegrator *
00814 FEM_ObjectBroker::getNewTransientIntegrator(int classTag)
00815 {
00816 switch(classTag) {
00817 case INTEGRATOR_TAGS_Newmark:
00818 return new Newmark();
00819
00820
00821 default:
00822 cerr << "FEM_ObjectBroker::getNewTransientIntegrator - ";
00823 cerr << " - no TransientIntegrator type exists for class tag ";
00824 cerr << classTag << endl;
00825 return 0;
00826
00827 }
00828 }
00829
00830
00831 IncrementalIntegrator *
00832 FEM_ObjectBroker::getNewIncrementalIntegrator(int classTag)
00833 {
00834 switch(classTag) {
00835 case INTEGRATOR_TAGS_LoadControl:
00836 return new LoadControl(1.0,1.0,1.0,1.0);
00837
00838
00839 case INTEGRATOR_TAGS_ArcLength:
00840 return new ArcLength(1.0);
00841
00842
00843 case INTEGRATOR_TAGS_Newmark:
00844 return new Newmark();
00845
00846
00847 default:
00848 cerr << "FEM_ObjectBroker::getNewIncrementalIntegrator - ";
00849 cerr << " - no IncrementalIntegrator type exists for class tag ";
00850 cerr << classTag << endl;
00851 return 0;
00852
00853 }
00854 }
00855
00856
00857 LinearSOESolver *
00858 FEM_ObjectBroker::getNewLinearSolver(void)
00859 {
00860 return lastLinearSolver;
00861 }
00862
00863 LinearSOE *
00864 FEM_ObjectBroker::getNewLinearSOE(int classTagSOE,
00865 int classTagSolver)
00866 {
00867 LinearSOE *theSOE =0;
00868
00869 FullGenLinSolver *theGenSolver =0;
00870 BandGenLinSolver *theGenBandSolver =0;
00871 BandSPDLinSolver *theBandSPDSolver =0;
00872 ProfileSPDLinSolver *theProfileSPDSolver =0;
00873
00874
00875
00876
00877
00878
00879
00880
00881
00882
00883
00884
00885
00886
00887
00888
00889
00890
00891 switch(classTagSOE) {
00892 case LinSOE_TAGS_FullGenLinSOE:
00893
00894 if (classTagSolver == SOLVER_TAGS_FullGenLinLapackSolver) {
00895 theGenSolver = new FullGenLinLapackSolver();
00896 theSOE = new FullGenLinSOE(*theGenSolver);
00897 lastLinearSolver = theGenSolver;
00898 return theSOE;
00899 } else {
00900 cerr << "FEM_ObjectBroker::getNewLinearSOE - ";
00901 cerr << " - no FullGenLinSOESolver type exists for class tag ";
00902 cerr << classTagSolver << endl;
00903 return 0;
00904 }
00905
00906
00907 case LinSOE_TAGS_BandGenLinSOE:
00908
00909 if (classTagSolver == SOLVER_TAGS_BandGenLinLapackSolver) {
00910 theGenBandSolver = new BandGenLinLapackSolver();
00911 theSOE = new BandGenLinSOE(*theGenBandSolver);
00912 lastLinearSolver = theGenBandSolver;
00913 return theSOE;
00914 } else {
00915 cerr << "FEM_ObjectBroker::getNewLinearSOE - ";
00916 cerr << " - no BandGenLinSolver type exists for class tag ";
00917 cerr << classTagSolver << endl;
00918 return 0;
00919 }
00920
00921
00922 case LinSOE_TAGS_BandSPDLinSOE:
00923
00924 if (classTagSolver == SOLVER_TAGS_BandSPDLinLapackSolver) {
00925 theBandSPDSolver = new BandSPDLinLapackSolver();
00926 theSOE = new BandSPDLinSOE(*theBandSPDSolver);
00927 lastLinearSolver = theBandSPDSolver;
00928 return theSOE;
00929 } else {
00930 cerr << "FEM_ObjectBroker::getNewLinearSOE - ";
00931 cerr << " - no BandSPDLinSOESolver type exists for class tag ";
00932 cerr << classTagSolver << endl;
00933 return 0;
00934 }
00935
00936
00937 case LinSOE_TAGS_ProfileSPDLinSOE:
00938
00939 if (classTagSolver == SOLVER_TAGS_ProfileSPDLinDirectSolver) {
00940 theProfileSPDSolver = new ProfileSPDLinDirectSolver();
00941 theSOE = new ProfileSPDLinSOE(*theProfileSPDSolver);
00942 lastLinearSolver = theProfileSPDSolver;
00943 return theSOE;
00944 } else if (classTagSolver == SOLVER_TAGS_ProfileSPDLinSubstrSolver) {
00945 theProfileSPDSolver = new ProfileSPDLinSubstrSolver();
00946 theSOE = new ProfileSPDLinSOE(*theProfileSPDSolver);
00947 lastLinearSolver = theProfileSPDSolver;
00948 return 0;
00949 }
00950 else {
00951 cerr << "FEM_ObjectBroker::getNewLinearSOE - ";
00952 cerr << " - no ProfileSPD_LinSolver type exists for class tag ";
00953 cerr << classTagSolver << endl;
00954 return 0;
00955 }
00956
00957
00958 default:
00959 cerr << "FEM_ObjectBroker::getNewLinearSOE - ";
00960 cerr << " - no LinearSOE type exists for class tag ";
00961 cerr << classTagSOE << endl;
00962 return 0;
00963
00964
00965 }
00966 }
00967
00968
00969
00970
00971 DomainSolver *
00972 FEM_ObjectBroker::getNewDomainSolver(void)
00973 {
00974 return lastDomainSolver;
00975 }
00976
00977 LinearSOE *
00978 FEM_ObjectBroker::getPtrNewDDLinearSOE(int classTagSOE,
00979 int classTagDDSolver)
00980 {
00981 ProfileSPDLinSubstrSolver *theProfileSPDSolver =0;
00982
00983 switch(classTagSOE) {
00984 case LinSOE_TAGS_ProfileSPDLinSOE:
00985
00986 if (classTagDDSolver == SOLVER_TAGS_ProfileSPDLinSubstrSolver) {
00987 theProfileSPDSolver = new ProfileSPDLinSubstrSolver();
00988 LinearSOE *theSOE = new ProfileSPDLinSOE(*theProfileSPDSolver);
00989 lastDomainSolver = theProfileSPDSolver;
00990 return theSOE;
00991 }
00992 else {
00993 cerr << "FEM_ObjectBroker::getNewLinearSOE - ";
00994 cerr << " - no ProfileSPD Domain Solver type exists for class tag ";
00995 cerr << classTagDDSolver << endl;
00996 return 0;
00997 }
00998
00999
01000 default:
01001 cerr << "FEM_ObjectBroker::getNewLinearSOE - ";
01002 cerr << " - no LinearSOE type exists for class tag ";
01003 cerr << classTagSOE << endl;
01004 return 0;
01005
01006 }
01007 }
01008
01009
01010 DomainDecompositionAnalysis *
01011 FEM_ObjectBroker::getNewDomainDecompAnalysis(int classTag,
01012 Subdomain &theSubdomain)
01013 {
01014 switch(classTag) {
01015 case DomDecompANALYSIS_TAGS_DomainDecompositionAnalysis:
01016 return new DomainDecompositionAnalysis(theSubdomain);
01017
01018
01019 default:
01020 cerr << "ObjectBroker::getNewDomainDecompAnalysis ";
01021 cerr << " - no DomainDecompAnalysis type exists for class tag " ;
01022 cerr << classTag << endl;
01023 return 0;
01024
01025 }
01026 }
01027
01028
01029 Subdomain *
01030 FEM_ObjectBroker::getSubdomainPtr(int classTag)
01031 {
01032 cerr << "FEM_ObjectBroker: NOT IMPLEMENTED YET";
01033 return 0;
01034 }
01035
01036
01037
01038