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 #include <FEM_ObjectBroker.h>
00038
00039
00040 #include <ActorSubdomain.h>
00041
00042
00043 #include <CTestNormUnbalance.h>
00044 #include <CTestNormDispIncr.h>
00045 #include <CTestEnergyIncr.h>
00046
00047
00048 #include <RCM.h>
00049 #include <MyRCM.h>
00050 #include <SimpleNumberer.h>
00051
00052
00053
00054 #include <ElasticMaterial.h>
00055 #include <ElasticPPMaterial.h>
00056 #include <ParallelMaterial.h>
00057 #include <Concrete01.h>
00058 #include <Steel01.h>
00059 #include <HardeningMaterial.h>
00060 #include <HystereticMaterial.h>
00061 #include <EPPGapMaterial.h>
00062 #include <ViscousMaterial.h>
00063 #include <PathIndependentMaterial.h>
00064 #include <SeriesMaterial.h>
00065 #include <CableMaterial.h>
00066 #include <ENTMaterial.h>
00067 #include <MinMaxMaterial.h>
00068
00069
00070 #include <PySimple1.h>
00071 #include <TzSimple1.h>
00072 #include <QzSimple1.h>
00073 #include <PyLiq1.h>
00074 #include <TzLiq1.h>
00075
00076
00077 #include <FedeasBond1Material.h>
00078 #include <FedeasBond2Material.h>
00079 #include <FedeasConcr1Material.h>
00080 #include <FedeasConcr2Material.h>
00081 #include <FedeasConcr3Material.h>
00082 #include <FedeasHardeningMaterial.h>
00083 #include <FedeasHyster1Material.h>
00084 #include <FedeasHyster2Material.h>
00085 #include <FedeasSteel1Material.h>
00086 #include <FedeasSteel2Material.h>
00087
00088 #include <DrainBilinearMaterial.h>
00089 #include <DrainClough1Material.h>
00090 #include <DrainClough2Material.h>
00091 #include <DrainPinch1Material.h>
00092
00093
00094 #include <ElasticSection2d.h>
00095 #include <ElasticSection3d.h>
00096 #include <GenericSection1d.h>
00097
00098 #include <SectionAggregator.h>
00099
00100 #include <FiberSection2d.h>
00101 #include <FiberSection3d.h>
00102 #include <ElasticPlateSection.h>
00103 #include <ElasticMembranePlateSection.h>
00104 #include <MembranePlateFiberSection.h>
00105 #include <Bidirectional.h>
00106
00107
00108 #include <ElasticIsotropicPlaneStrain2D.h>
00109 #include <ElasticIsotropicPlaneStress2D.h>
00110 #include <ElasticIsotropicPlateFiber.h>
00111 #include <ElasticIsotropicAxiSymm.h>
00112 #include <ElasticIsotropic3D.h>
00113 #include <J2PlaneStrain.h>
00114 #include <J2PlaneStress.h>
00115 #include <J2PlateFiber.h>
00116 #include <J2AxiSymm.h>
00117 #include <J2ThreeDimensional.h>
00118 #include <PlaneStressMaterial.h>
00119 #include <PlateFiberMaterial.h>
00120 #include <FeapMaterial03.h>
00121
00122 #include <FluidSolidPorousMaterial.h>
00123 #include <PressureDependMultiYield.h>
00124 #include <PressureIndependMultiYield.h>
00125
00126
00127 #include <UniaxialFiber2d.h>
00128 #include <UniaxialFiber3d.h>
00129
00130 #include <Element.h>
00131 #include <beam2d02.h>
00132 #include <beam2d03.h>
00133 #include <beam2d04.h>
00134 #include <beam3d01.h>
00135 #include <beam3d02.h>
00136 #include <Truss.h>
00137 #include <TrussSection.h>
00138 #include <CorotTruss.h>
00139 #include <CorotTrussSection.h>
00140 #include <ZeroLength.h>
00141 #include <ZeroLengthSection.h>
00142
00143 #include <FourNodeQuad.h>
00144 #include <EnhancedQuad.h>
00145 #include <NineNodeMixedQuad.h>
00146 #include <ConstantPressureVolumeQuad.h>
00147 #include <ElasticBeam2d.h>
00148 #include <ElasticBeam3d.h>
00149 #include <ForceBeamColumn2d.h>
00150 #include <ForceBeamColumn3d.h>
00151
00152 #include <DispBeamColumn2d.h>
00153 #include <DispBeamColumn3d.h>
00154 #include <ShellMITC4.h>
00155 #include <Brick.h>
00156 #include <BbarBrick.h>
00157 #include <Joint2D.h>
00158
00159
00160 #include <LinearCrdTransf2d.h>
00161 #include <LinearCrdTransf3d.h>
00162 #include <PDeltaCrdTransf2d.h>
00163 #include <PDeltaCrdTransf3d.h>
00164 #include <CorotCrdTransf2d.h>
00165 #include <CorotCrdTransf3d.h>
00166
00167 #include <HingeMidpointBeamIntegration.h>
00168 #include <HingeEndpointBeamIntegration.h>
00169 #include <HingeRadauBeamIntegration.h>
00170 #include <HingeRadauTwoBeamIntegration.h>
00171 #include <LobattoBeamIntegration.h>
00172 #include <LegendreBeamIntegration.h>
00173 #include <RadauBeamIntegration.h>
00174 #include <NewtonCotesBeamIntegration.h>
00175
00176
00177 #include <Node.h>
00178
00179
00180 #include <FileStream.h>
00181 #include <StandardStream.h>
00182 #include <XmlFileStream.h>
00183 #include <DataFileStream.h>
00184 #include <DatabaseStream.h>
00185
00186 #include <NodeRecorder.h>
00187 #include <ElementRecorder.h>
00188 #include <EnvelopeNodeRecorder.h>
00189 #include <EnvelopeElementRecorder.h>
00190
00191
00192 #include <MP_Constraint.h>
00193 #include <MP_Joint2D.h>
00194
00195
00196 #include <SP_Constraint.h>
00197 #include <SP_Constraint.h>
00198 #include <ImposedMotionSP.h>
00199 #include <ImposedMotionSP1.h>
00200
00201
00202 #include <NodalLoad.h>
00203
00204
00205 #include <ElementalLoad.h>
00206 #include<Beam2dUniformLoad.h>
00207 #include<Beam2dPointLoad.h>
00208 #include<Beam3dUniformLoad.h>
00209 #include<Beam3dPointLoad.h>
00210 #include<BrickSelfWeight.h>
00211
00212
00213 #include <Matrix.h>
00214 #include <Vector.h>
00215 #include <ID.h>
00216
00217
00218 #include <Subdomain.h>
00219
00220
00221 #include <ConstraintHandler.h>
00222 #include <PlainHandler.h>
00223 #include <PenaltyConstraintHandler.h>
00224 #include <LagrangeConstraintHandler.h>
00225 #include <TransformationConstraintHandler.h>
00226
00227
00228 #include <DOF_Numberer.h>
00229 #include <PlainNumberer.h>
00230
00231
00232 #include <AnalysisModel.h>
00233
00234
00235 #include <EquiSolnAlgo.h>
00236 #include <Linear.h>
00237 #include <NewtonRaphson.h>
00238 #include <ModifiedNewton.h>
00239
00240
00241 #include <DomainDecompAlgo.h>
00242
00243
00244 #include <LoadControl.h>
00245 #include <ArcLength.h>
00246 #include <TransientIntegrator.h>
00247 #include <Newmark.h>
00248 #include <DisplacementControl.h>
00249 #include <CentralDifferenceNoDamping.h>
00250 #include <CentralDifferenceAlternative.h>
00251
00252 #ifdef _PARALLEL_PROCESSING
00253 #include <DistributedDisplacementControl.h>
00254 #endif
00255
00256 #include <LinearSOE.h>
00257 #include <DomainSolver.h>
00258 #include <FullGenLinSOE.h>
00259 #include <FullGenLinLapackSolver.h>
00260 #include <BandGenLinSOE.h>
00261
00262 #include <BandGenLinLapackSolver.h>
00263 #include <BandSPDLinSOE.h>
00264 #include <BandSPDLinLapackSolver.h>
00265 #include <ProfileSPDLinSOE.h>
00266 #include <ProfileSPDLinDirectSolver.h>
00267 #include <ProfileSPDLinSubstrSolver.h>
00268
00269 #include <SparseGenColLinSOE.h>
00270 #include <SuperLU.h>
00271
00272 #include <DomainDecompositionAnalysis.h>
00273
00274
00275 #include <LoadPattern.h>
00276 #include <UniformExcitation.h>
00277 #include <MultiSupportPattern.h>
00278 #include <GroundMotion.h>
00279 #include <InterpolatedGroundMotion.h>
00280
00281
00282 #include <LinearSeries.h>
00283 #include <PathSeries.h>
00284 #include <PathTimeSeries.h>
00285 #include <RectangularSeries.h>
00286 #include <ConstantSeries.h>
00287 #include <TrigSeries.h>
00288
00289
00290 #include <TrapezoidalTimeSeriesIntegrator.h>
00291
00292 #ifdef _PETSC
00293 #include <PetscSOE.h>
00294 #include <PetscSolver.h>
00295 #include <SparseGenColLinSOE.h>
00296 #include <PetscSparseSeqSolver.h>
00297 #endif
00298
00299
00300 #ifdef _MUMPS
00301 #include <MumpsSOE.h>
00302 #include <MumpsSolver.h>
00303 #ifdef _PARALLEL_PROCESSING
00304 #include <MumpsParallelSOE.h>
00305 #include <MumpsParallelSolver.h>
00306 #endif
00307 #endif
00308
00309 #ifdef _PARALLEL_PROCESSING
00310 #include <DistributedBandSPDLinSOE.h>
00311 #include <DistributedProfileSPDLinSOE.h>
00312 #include <DistributedSparseGenColLinSOE.h>
00313 #include <DistributedSparseGenRowLinSOE.h>
00314 #include <DistributedSparseGenRowLinSolver.h>
00315 #include <DistributedBandGenLinSOE.h>
00316 #include <DistributedSuperLU.h>
00317 #include <ParallelNumberer.h>
00318 #include <StaticDomainDecompositionAnalysis.h>
00319 #include <TransientDomainDecompositionAnalysis.h>
00320 #include <DistributedDiagonalSOE.h>
00321 #include <DistributedDiagonalSolver.h>
00322 #endif
00323
00324 #include <packages.h>
00325
00326 typedef struct uniaxialPackage {
00327 int classTag;
00328 char *libName;
00329 char *funcName;
00330 UniaxialMaterial *(*funcPtr)(void);
00331 struct uniaxialPackage *next;
00332 } UniaxialPackage;
00333
00334 static UniaxialPackage *theUniaxialPackage = NULL;
00335
00336
00337
00338 FEM_ObjectBroker::FEM_ObjectBroker()
00339 :lastLinearSolver(0),lastDomainSolver(0)
00340 {
00341
00342 }
00343
00344
00345 FEM_ObjectBroker::~FEM_ObjectBroker()
00346 {
00347
00348 }
00349
00350
00351 Actor *
00352 FEM_ObjectBroker::getNewActor(int classTag, Channel *theChannel)
00353 {
00354 switch(classTag) {
00355
00356 #ifdef _PARALLEL_PROCESSING
00357 case ACTOR_TAGS_SUBDOMAIN:
00358 return new ActorSubdomain(*theChannel, *this);
00359 #endif
00360
00361 default:
00362 opserr << "FEM_ObjectBroker::getNewActor - ";
00363 opserr << " - no ActorType type exists for class tag ";
00364 opserr << classTag << endln;
00365 return 0;
00366 }
00367 }
00368
00369
00370 PartitionedModelBuilder *
00371 FEM_ObjectBroker::getPtrNewPartitionedModelBuilder(Subdomain &theSubdomain,
00372 int classTag)
00373 {
00374 switch(classTag) {
00375
00376
00377
00378
00379
00380 default:
00381 opserr << "FEM_ObjectBroker::getPtrNewPartitionedModelBuilder - ";
00382 opserr << " - no PartitionedModelBuilder type exists for class tag ";
00383 opserr << classTag << endln;
00384 return 0;
00385
00386 }
00387 }
00388
00389
00390 GraphNumberer *
00391 FEM_ObjectBroker::getPtrNewGraphNumberer(int classTag)
00392 {
00393 switch(classTag) {
00394 case GraphNUMBERER_TAG_RCM:
00395 return new RCM();
00396
00397
00398 case GraphNUMBERER_TAG_MyRCM:
00399 return new MyRCM();
00400
00401
00402 case GraphNUMBERER_TAG_SimpleNumberer:
00403 return new SimpleNumberer();
00404
00405
00406 default:
00407 opserr << "ObjectBroker::getPtrNewGraphNumberer - ";
00408 opserr << " - no GraphNumberer type exists for class tag " ;
00409 opserr << classTag << endln;
00410 return 0;
00411
00412 }
00413 }
00414
00415
00416
00417
00418
00419
00420
00421
00422
00423
00424
00425
00426
00427
00428 Element *
00429 FEM_ObjectBroker::getNewElement(int classTag)
00430 {
00431 switch(classTag) {
00432
00433 case ELE_TAG_Truss:
00434 return new Truss();
00435
00436 case ELE_TAG_TrussSection:
00437 return new TrussSection();
00438
00439 case ELE_TAG_CorotTruss:
00440 return new CorotTruss();
00441
00442 case ELE_TAG_CorotTrussSection:
00443 return new CorotTrussSection();
00444
00445 case ELE_TAG_ZeroLength:
00446 return new ZeroLength();
00447
00448 case ELE_TAG_ZeroLengthSection:
00449 return new ZeroLengthSection();
00450
00451
00452
00453
00454 case ELE_TAG_FourNodeQuad:
00455 return new FourNodeQuad();
00456
00457 case ELE_TAG_ElasticBeam2d:
00458 return new ElasticBeam2d();
00459
00460 case ELE_TAG_ElasticBeam3d:
00461 return new ElasticBeam3d();
00462
00463 case ELE_TAG_ForceBeamColumn2d:
00464 return new ForceBeamColumn2d();
00465
00466 case ELE_TAG_ForceBeamColumn3d:
00467 return new ForceBeamColumn3d();
00468
00469 case ELE_TAG_DispBeamColumn2d:
00470 return new DispBeamColumn2d();
00471
00472 case ELE_TAG_DispBeamColumn3d:
00473 return new DispBeamColumn3d();
00474
00475 case ELE_TAG_EnhancedQuad:
00476 return new EnhancedQuad();
00477
00478 case ELE_TAG_NineNodeMixedQuad:
00479 return new NineNodeMixedQuad();
00480
00481 case ELE_TAG_ConstantPressureVolumeQuad:
00482 return new ConstantPressureVolumeQuad();
00483
00484 case ELE_TAG_Brick:
00485 return new Brick();
00486
00487 case ELE_TAG_ShellMITC4:
00488 return new ShellMITC4();
00489
00490 case ELE_TAG_BbarBrick:
00491 return new BbarBrick();
00492
00493 case ELE_TAG_Joint2D:
00494 return new Joint2D();
00495
00496 default:
00497 opserr << "FEM_ObjectBroker::getNewElement - ";
00498 opserr << " - no Element type exists for class tag " ;
00499 opserr << classTag << endln;
00500 return 0;
00501
00502 }
00503 }
00504
00505 Node *
00506 FEM_ObjectBroker::getNewNode(int classTag)
00507 {
00508 switch(classTag) {
00509 case NOD_TAG_Node:
00510 return new Node(classTag);
00511
00512
00513 default:
00514 opserr << "FEM_ObjectBroker::getNewNode - ";
00515 opserr << " - no Node type exists for class tag ";
00516 opserr << classTag << endln;
00517 return 0;
00518
00519 }
00520 }
00521
00522
00523 MP_Constraint *
00524 FEM_ObjectBroker::getNewMP(int classTag)
00525 {
00526 switch(classTag) {
00527 case CNSTRNT_TAG_MP_Constraint:
00528 return new MP_Constraint( 0 , classTag);
00529
00530 case CNSTRNT_TAG_MP_Joint2D:
00531 return new MP_Joint2D();
00532
00533 default:
00534 opserr << "FEM_ObjectBroker::getNewMP - ";
00535 opserr << " - no MP_Constraint type exists for class tag ";
00536 opserr << classTag << endln;
00537 return 0;
00538
00539 }
00540 }
00541
00542
00543 SP_Constraint *
00544 FEM_ObjectBroker::getNewSP(int classTag)
00545 {
00546 switch(classTag) {
00547 case CNSTRNT_TAG_SP_Constraint:
00548 return new SP_Constraint(classTag);
00549
00550 case CNSTRNT_TAG_ImposedMotionSP:
00551 return new ImposedMotionSP();
00552
00553 case CNSTRNT_TAG_ImposedMotionSP1:
00554 return new ImposedMotionSP1();
00555
00556 default:
00557 opserr << "FEM_ObjectBroker::getNewSP - ";
00558 opserr << " - no SP_Constraint type exists for class tag ";
00559 opserr << classTag << endln;
00560 return 0;
00561
00562 }
00563 }
00564
00565 NodalLoad *
00566 FEM_ObjectBroker::getNewNodalLoad(int classTag)
00567 {
00568 switch(classTag) {
00569 case LOAD_TAG_NodalLoad:
00570 return new NodalLoad(classTag);
00571
00572
00573 default:
00574 opserr << "FEM_ObjectBroker::getNewNodalLoad - ";
00575 opserr << " - no NodalLoad type exists for class tag ";
00576 opserr << classTag << endln;
00577 return 0;
00578
00579 }
00580 }
00581
00582
00583 ElementalLoad *
00584 FEM_ObjectBroker::getNewElementalLoad(int classTag)
00585 {
00586 switch(classTag) {
00587
00588 case LOAD_TAG_Beam2dUniformLoad:
00589 return new Beam2dUniformLoad();
00590
00591 case LOAD_TAG_Beam2dPointLoad:
00592 return new Beam2dPointLoad();
00593
00594 case LOAD_TAG_Beam3dUniformLoad:
00595 return new Beam3dUniformLoad();
00596
00597 case LOAD_TAG_Beam3dPointLoad:
00598 return new Beam3dPointLoad();
00599
00600 case LOAD_TAG_BrickSelfWeight:
00601 return new BrickSelfWeight();
00602
00603 default:
00604 opserr << "FEM_ObjectBroker::getNewNodalLoad - ";
00605 opserr << " - no NodalLoad type exists for class tag ";
00606 opserr << classTag << endln;
00607 return 0;
00608
00609 }
00610
00611 return 0;
00612 }
00613
00614 CrdTransf2d*
00615 FEM_ObjectBroker::getNewCrdTransf2d(int classTag)
00616 {
00617 switch(classTag) {
00618 case CRDTR_TAG_LinearCrdTransf2d:
00619 return new LinearCrdTransf2d();
00620 case CRDTR_TAG_PDeltaCrdTransf2d:
00621 return new PDeltaCrdTransf2d();
00622 #ifdef _COROTATIONAL
00623 case CRDTR_TAG_CorotCrdTransf2d:
00624 return new CorotCrdTransf2d();
00625 #endif
00626 default:
00627 opserr << "FEM_ObjectBroker::getCrdTransf2d - ";
00628 opserr << " - no CrdTransf2d type exists for class tag ";
00629 opserr << classTag << endln;
00630 return 0;
00631 }
00632
00633 }
00634
00635 CrdTransf3d*
00636 FEM_ObjectBroker::getNewCrdTransf3d(int classTag)
00637 {
00638 switch(classTag) {
00639 case CRDTR_TAG_LinearCrdTransf3d:
00640 return new LinearCrdTransf3d();
00641 case CRDTR_TAG_PDeltaCrdTransf3d:
00642 return new PDeltaCrdTransf3d();
00643 #ifdef _COROTATIONAL
00644 case CRDTR_TAG_CorotCrdTransf3d:
00645 return new CorotCrdTransf3d();
00646 #endif
00647 default:
00648 opserr << "FEM_ObjectBroker::getCrdTransf3d - ";
00649 opserr << " - no CrdTransf3d type exists for class tag ";
00650 opserr << classTag << endln;
00651 return 0;
00652 }
00653
00654 }
00655
00656 BeamIntegration *
00657 FEM_ObjectBroker::getNewBeamIntegration(int classTag)
00658 {
00659 switch(classTag) {
00660 case BEAM_INTEGRATION_TAG_Lobatto:
00661 return new LobattoBeamIntegration();
00662
00663 case BEAM_INTEGRATION_TAG_Legendre:
00664 return new LegendreBeamIntegration();
00665
00666 case BEAM_INTEGRATION_TAG_Radau:
00667 return new RadauBeamIntegration();
00668
00669 case BEAM_INTEGRATION_TAG_NewtonCotes:
00670 return new NewtonCotesBeamIntegration();
00671
00672 case BEAM_INTEGRATION_TAG_HingeMidpoint:
00673 return new HingeMidpointBeamIntegration();
00674
00675 case BEAM_INTEGRATION_TAG_HingeRadau:
00676 return new HingeRadauBeamIntegration();
00677
00678 case BEAM_INTEGRATION_TAG_HingeRadauTwo:
00679 return new HingeRadauTwoBeamIntegration();
00680
00681 case BEAM_INTEGRATION_TAG_HingeEndpoint:
00682 return new HingeEndpointBeamIntegration();
00683
00684 default:
00685 opserr << "FEM_ObjectBroker::getBeamIntegration - ";
00686 opserr << " - no BeamIntegration type exists for class tag ";
00687 opserr << classTag << endln;
00688 return 0;
00689 }
00690 }
00691
00692
00693 UniaxialMaterial *
00694 FEM_ObjectBroker::getNewUniaxialMaterial(int classTag)
00695 {
00696 switch(classTag) {
00697 case MAT_TAG_ElasticMaterial:
00698 return new ElasticMaterial();
00699
00700 case MAT_TAG_ElasticPPMaterial:
00701 return new ElasticPPMaterial();
00702
00703 case MAT_TAG_ParallelMaterial:
00704 return new ParallelMaterial();
00705
00706 case MAT_TAG_Concrete01:
00707 return new Concrete01();
00708
00709 case MAT_TAG_Steel01:
00710 return new Steel01();
00711
00712 case MAT_TAG_Hardening:
00713 return new HardeningMaterial();
00714
00715
00716 case MAT_TAG_PySimple1:
00717 return new PySimple1();
00718
00719 case MAT_TAG_PyLiq1:
00720 return new PyLiq1();
00721
00722 case MAT_TAG_TzSimple1:
00723 return new TzSimple1();
00724
00725 case MAT_TAG_TzLiq1:
00726 return new TzLiq1();
00727
00728 case MAT_TAG_QzSimple1:
00729 return new QzSimple1();
00730
00731
00732 case MAT_TAG_Hysteretic:
00733 return new HystereticMaterial();
00734
00735 case MAT_TAG_EPPGap:
00736 return new EPPGapMaterial();
00737
00738 case MAT_TAG_Viscous:
00739 return new ViscousMaterial();
00740
00741 case MAT_TAG_PathIndependent:
00742 return new PathIndependentMaterial();
00743
00744 case MAT_TAG_SeriesMaterial:
00745 return new SeriesMaterial();
00746
00747 case MAT_TAG_CableMaterial:
00748 return new CableMaterial();
00749
00750 case MAT_TAG_ENTMaterial:
00751 return new ENTMaterial();
00752
00753 case MAT_TAG_FedeasBond1:
00754 return new FedeasBond1Material();
00755
00756 case MAT_TAG_FedeasBond2:
00757 return new FedeasBond2Material();
00758
00759 case MAT_TAG_FedeasConcrete1:
00760 return new FedeasConcr1Material();
00761
00762 case MAT_TAG_FedeasConcrete2:
00763 return new FedeasConcr2Material();
00764
00765 case MAT_TAG_FedeasConcrete3:
00766 return new FedeasConcr3Material();
00767
00768 case MAT_TAG_FedeasHardening:
00769 return new FedeasHardeningMaterial();
00770
00771 case MAT_TAG_FedeasHysteretic1:
00772 return new FedeasHyster1Material();
00773
00774 case MAT_TAG_FedeasHysteretic2:
00775 return new FedeasHyster2Material();
00776
00777 case MAT_TAG_FedeasSteel1:
00778 return new FedeasSteel1Material();
00779
00780 case MAT_TAG_FedeasSteel2:
00781 return new FedeasSteel2Material();
00782
00783 case MAT_TAG_DrainBilinear:
00784 return new DrainBilinearMaterial();
00785
00786 case MAT_TAG_DrainClough1:
00787 return new DrainClough1Material();
00788
00789 case MAT_TAG_DrainClough2:
00790 return new DrainClough2Material();
00791
00792 case MAT_TAG_DrainPinch1:
00793 return new DrainPinch1Material();
00794
00795 case MAT_TAG_MinMax:
00796 return new MinMaxMaterial();
00797
00798 default:
00799
00800 UniaxialPackage *matCommands = theUniaxialPackage;
00801 bool found = false;
00802 while (matCommands != NULL && found == false) {
00803 if ((matCommands->classTag == classTag) && (matCommands->funcPtr != 0)){
00804 UniaxialMaterial *result = (*(matCommands->funcPtr))();
00805 return result;
00806 }
00807 matCommands = matCommands->next;
00808 }
00809
00810 opserr << "FEM_ObjectBroker::getNewUniaxialMaterial - ";
00811 opserr << " - no UniaxialMaterial type exists for class tag ";
00812 opserr << classTag << endln;
00813 return 0;
00814
00815 }
00816 }
00817
00818 SectionForceDeformation *
00819 FEM_ObjectBroker::getNewSection(int classTag)
00820 {
00821 switch(classTag) {
00822 case SEC_TAG_Elastic2d:
00823 return new ElasticSection2d();
00824
00825 case SEC_TAG_Elastic3d:
00826 return new ElasticSection3d();
00827
00828 case SEC_TAG_Generic1d:
00829 return new GenericSection1d();
00830
00831
00832
00833
00834 case SEC_TAG_Aggregator:
00835 return new SectionAggregator();
00836
00837
00838
00839
00840 case SEC_TAG_FiberSection2d:
00841 return new FiberSection2d();
00842
00843 case SEC_TAG_FiberSection3d:
00844 return new FiberSection3d();
00845
00846 case SEC_TAG_ElasticPlateSection:
00847 return new ElasticPlateSection();
00848
00849 case SEC_TAG_ElasticMembranePlateSection:
00850 return new ElasticMembranePlateSection();
00851
00852 case SEC_TAG_MembranePlateFiberSection:
00853 return new MembranePlateFiberSection();
00854
00855 case SEC_TAG_Bidirectional:
00856 return new Bidirectional();
00857
00858 default:
00859 opserr << "FEM_ObjectBroker::getNewSection - ";
00860 opserr << " - no section type exists for class tag ";
00861 opserr << classTag << endln;
00862 return 0;
00863
00864 }
00865 }
00866
00867 NDMaterial*
00868 FEM_ObjectBroker::getNewNDMaterial(int classTag)
00869 {
00870 switch(classTag) {
00871 case ND_TAG_ElasticIsotropicPlaneStrain2d:
00872 return new ElasticIsotropicPlaneStrain2D();
00873
00874 case ND_TAG_ElasticIsotropicPlaneStress2d:
00875 return new ElasticIsotropicPlaneStress2D();
00876
00877 case ND_TAG_ElasticIsotropicAxiSymm:
00878 return new ElasticIsotropicAxiSymm();
00879
00880 case ND_TAG_ElasticIsotropicPlateFiber:
00881 return new ElasticIsotropicPlateFiber();
00882
00883 case ND_TAG_ElasticIsotropic3D:
00884 return new ElasticIsotropic3D();
00885
00886 case ND_TAG_J2PlaneStrain:
00887 return new J2PlaneStrain();
00888
00889 case ND_TAG_J2PlaneStress:
00890 return new J2PlaneStress();
00891
00892 case ND_TAG_J2AxiSymm:
00893 return new J2AxiSymm();
00894
00895 case ND_TAG_J2PlateFiber:
00896 return new J2PlateFiber();
00897
00898 case ND_TAG_J2ThreeDimensional:
00899 return new J2ThreeDimensional();
00900
00901 case ND_TAG_PlaneStressMaterial:
00902 return new PlaneStressMaterial();
00903
00904 case ND_TAG_PlateFiberMaterial:
00905 return new PlateFiberMaterial();
00906
00907 case ND_TAG_FluidSolidPorousMaterial:
00908 return new FluidSolidPorousMaterial();
00909
00910 case ND_TAG_PressureDependMultiYield:
00911 return new PressureDependMultiYield();
00912
00913 case ND_TAG_PressureIndependMultiYield:
00914 return new PressureIndependMultiYield();
00915
00916 case ND_TAG_FeapMaterial03:
00917 return new FeapMaterial03();
00918
00919 default:
00920 opserr << "FEM_ObjectBroker::getNewNDMaterial - ";
00921 opserr << " - no NDMaterial type exists for class tag ";
00922 opserr << classTag << endln;
00923 return 0;
00924 }
00925 }
00926
00927 Fiber*
00928 FEM_ObjectBroker::getNewFiber(int classTag)
00929 {
00930 switch(classTag) {
00931 case FIBER_TAG_Uniaxial2d:
00932 return new UniaxialFiber2d();
00933
00934 case FIBER_TAG_Uniaxial3d:
00935 return new UniaxialFiber3d();
00936
00937 default:
00938 opserr << "FEM_ObjectBroker::getNewFiber - ";
00939 opserr << " - no Fiber type exists for class tag ";
00940 opserr << classTag << endln;
00941 return 0;
00942 }
00943 }
00944
00945 ConvergenceTest *
00946 FEM_ObjectBroker::getNewConvergenceTest(int classTag)
00947 {
00948 switch(classTag) {
00949 case CONVERGENCE_TEST_CTestNormUnbalance:
00950 return new CTestNormUnbalance();
00951
00952 case CONVERGENCE_TEST_CTestNormDispIncr:
00953 return new CTestNormDispIncr();
00954
00955 case CONVERGENCE_TEST_CTestEnergyIncr:
00956 return new CTestEnergyIncr();
00957
00958
00959 default:
00960 opserr << "FEM_ObjectBroker::getNewConvergenceTest - ";
00961 opserr << " - no ConvergenceTest type exists for class tag ";
00962 opserr << classTag << endln;
00963 return 0;
00964
00965 }
00966 }
00967
00968
00969 LoadPattern *
00970 FEM_ObjectBroker::getNewLoadPattern(int classTag)
00971 {
00972 switch(classTag) {
00973 case PATTERN_TAG_LoadPattern:
00974 return new LoadPattern();
00975
00976 case PATTERN_TAG_UniformExcitation:
00977 return new UniformExcitation();
00978
00979 case PATTERN_TAG_MultiSupportPattern:
00980 return new MultiSupportPattern();
00981
00982 default:
00983 opserr << "FEM_ObjectBroker::getPtrLoadPattern - ";
00984 opserr << " - no Load type exists for class tag ";
00985 opserr << classTag << endln;
00986 return 0;
00987
00988 }
00989 }
00990
00991
00992 GroundMotion *
00993 FEM_ObjectBroker::getNewGroundMotion(int classTag)
00994 {
00995 switch(classTag) {
00996
00997 case GROUND_MOTION_TAG_GroundMotion:
00998 return new GroundMotion(GROUND_MOTION_TAG_GroundMotion);
00999
01000 case GROUND_MOTION_TAG_InterpolatedGroundMotion:
01001 return new GroundMotion(GROUND_MOTION_TAG_InterpolatedGroundMotion);
01002
01003 default:
01004 opserr << "FEM_ObjectBroker::getPtrGroundMotion - ";
01005 opserr << " - no Load type exists for class tag ";
01006 opserr << classTag << endln;
01007 return 0;
01008
01009 }
01010 }
01011
01012 TimeSeries *
01013 FEM_ObjectBroker::getNewTimeSeries(int classTag)
01014 {
01015 switch(classTag) {
01016 case TSERIES_TAG_LinearSeries:
01017 return new LinearSeries;
01018
01019 case TSERIES_TAG_RectangularSeries:
01020 return new RectangularSeries;
01021
01022 case TSERIES_TAG_PathTimeSeries:
01023 return new PathTimeSeries;
01024
01025 case TSERIES_TAG_PathSeries:
01026 return new PathSeries;
01027
01028 case TSERIES_TAG_ConstantSeries:
01029 return new ConstantSeries;
01030
01031 case TSERIES_TAG_TrigSeries:
01032 return new TrigSeries;
01033
01034 default:
01035 opserr << "FEM_ObjectBroker::getPtrTimeSeries - ";
01036 opserr << " - no Load type exists for class tag ";
01037 opserr << classTag << endln;
01038 return 0;
01039
01040 }
01041 }
01042
01043 TimeSeriesIntegrator *
01044 FEM_ObjectBroker::getNewTimeSeriesIntegrator(int classTag)
01045 {
01046 switch(classTag) {
01047 case TIMESERIES_INTEGRATOR_TAG_Trapezoidal:
01048 return new TrapezoidalTimeSeriesIntegrator();
01049
01050 default:
01051 opserr << "FEM_ObjectBroker::getPtrTimeSeriesIntegrator - ";
01052 opserr << " - no Load type exists for class tag ";
01053 opserr << classTag << endln;
01054 return 0;
01055
01056 }
01057 }
01058
01059
01060 Matrix *
01061 FEM_ObjectBroker::getPtrNewMatrix(int classTag, int noRows, int noCols)
01062 {
01063 switch(classTag) {
01064 case MATRIX_TAG_Matrix:
01065 return new Matrix(noRows,noCols);
01066
01067
01068 default:
01069 opserr << "FEM_ObjectBroker::getPtrNewMatrix - ";
01070 opserr << " - no NodalLoad type exists for class tag ";
01071 opserr << classTag << endln;
01072 return 0;
01073
01074 }
01075 }
01076
01077
01078 Vector *
01079 FEM_ObjectBroker::getPtrNewVector(int classTag, int size)
01080 {
01081 switch(classTag) {
01082 case VECTOR_TAG_Vector:
01083 return new Vector(size);
01084
01085
01086 default:
01087 opserr << "FEM_ObjectBroker::getPtrNewVector - ";
01088 opserr << " - no Vector type exists for class tag ";
01089 opserr << classTag << endln;
01090 return 0;
01091
01092 }
01093 }
01094
01095
01096 ID *
01097 FEM_ObjectBroker::getPtrNewID(int classTag, int size)
01098 {
01099 switch(classTag) {
01100 case ID_TAG_ID:
01101 return new ID(size);
01102
01103
01104 default:
01105 opserr << "FEM_ObjectBroker::getPtrNewID - ";
01106 opserr << " - no ID type exists for class tag ";
01107 opserr << classTag << endln;
01108 return 0;
01109
01110 }
01111 }
01112
01113
01114
01115
01116
01117
01118
01119 OPS_Stream *
01120 FEM_ObjectBroker::getPtrNewStream(int classTag)
01121 {
01122 switch(classTag) {
01123 case OPS_STREAM_TAGS_StandardStream:
01124 return new StandardStream();
01125
01126 case OPS_STREAM_TAGS_FileStream:
01127 return new FileStream();
01128
01129 case OPS_STREAM_TAGS_XmlFileStream:
01130 return new XmlFileStream();
01131
01132 case OPS_STREAM_TAGS_DataFileStream:
01133 return new DataFileStream();
01134
01135 case OPS_STREAM_TAGS_DatabaseStream:
01136 return new DatabaseStream();
01137
01138
01139
01140 default:
01141 opserr << "FEM_ObjectBroker::getPtrNewStream - ";
01142 opserr << " - no DataOutputHandler type exists for class tag ";
01143 opserr << classTag << endln;
01144 return 0;
01145
01146 }
01147 }
01148
01149 Recorder *
01150 FEM_ObjectBroker::getPtrNewRecorder(int classTag)
01151 {
01152 switch(classTag) {
01153 case RECORDER_TAGS_ElementRecorder:
01154 return new ElementRecorder();
01155
01156 case RECORDER_TAGS_NodeRecorder:
01157 return new NodeRecorder();
01158
01159 case RECORDER_TAGS_EnvelopeNodeRecorder:
01160 return new EnvelopeNodeRecorder();
01161
01162 case RECORDER_TAGS_EnvelopeElementRecorder:
01163 return new EnvelopeElementRecorder();
01164
01165 default:
01166 opserr << "FEM_ObjectBroker::getNewConstraintHandler - ";
01167 opserr << " - no ConstraintHandler type exists for class tag ";
01168 opserr << classTag << endln;
01169 return 0;
01170
01171 }
01172 }
01173
01174
01175
01176
01177
01178
01179
01180
01181
01182 ConstraintHandler *
01183 FEM_ObjectBroker::getNewConstraintHandler(int classTag)
01184 {
01185 switch(classTag) {
01186 case HANDLER_TAG_PlainHandler:
01187 return new PlainHandler();
01188
01189 case HANDLER_TAG_PenaltyConstraintHandler:
01190 return new PenaltyConstraintHandler(1.0e12, 1.0e12);
01191
01192 case HANDLER_TAG_LagrangeConstraintHandler:
01193 return new LagrangeConstraintHandler(1.0, 1.0);
01194
01195 case HANDLER_TAG_TransformationConstraintHandler:
01196 return new TransformationConstraintHandler();
01197
01198 default:
01199 opserr << "FEM_ObjectBroker::getNewConstraintHandler - ";
01200 opserr << " - no ConstraintHandler type exists for class tag ";
01201 opserr << classTag << endln;
01202 return 0;
01203
01204 }
01205 }
01206
01207
01208 DOF_Numberer *
01209 FEM_ObjectBroker::getNewNumberer(int classTag)
01210 {
01211 switch(classTag) {
01212 case NUMBERER_TAG_DOF_Numberer:
01213 return new DOF_Numberer();
01214
01215
01216 case NUMBERER_TAG_PlainNumberer:
01217 return new PlainNumberer();
01218
01219
01220 #ifdef _PARALLEL_PROCESSING
01221 case NUMBERER_TAG_ParallelNumberer:
01222 return new ParallelNumberer();
01223 #endif
01224
01225 default:
01226 opserr << "FEM_ObjectBroker::getNewConstraintHandler - ";
01227 opserr << " - no ConstraintHandler type exists for class tag ";
01228 opserr << classTag << endln;
01229 return 0;
01230
01231 }
01232 }
01233
01234
01235 AnalysisModel *
01236 FEM_ObjectBroker::getNewAnalysisModel(int classTag)
01237 {
01238 switch(classTag) {
01239 case AnaMODEL_TAGS_AnalysisModel:
01240 return new AnalysisModel();
01241
01242
01243 default:
01244 opserr << "FEM_ObjectBroker::getNewAnalysisModel - ";
01245 opserr << " - no AnalysisModel type exists for class tag ";
01246 opserr << classTag << endln;
01247 return 0;
01248
01249 }
01250 }
01251
01252
01253 EquiSolnAlgo *
01254 FEM_ObjectBroker::getNewEquiSolnAlgo(int classTag)
01255 {
01256 switch(classTag) {
01257 case EquiALGORITHM_TAGS_Linear:
01258 return new Linear();
01259
01260
01261 case EquiALGORITHM_TAGS_NewtonRaphson:
01262 return new NewtonRaphson();
01263
01264
01265 case EquiALGORITHM_TAGS_ModifiedNewton:
01266 return new ModifiedNewton();
01267
01268
01269 default:
01270 opserr << "FEM_ObjectBroker::getNewEquiSolnAlgo - ";
01271 opserr << " - no EquiSolnAlgo type exists for class tag ";
01272 opserr << classTag << endln;
01273 return 0;
01274
01275 }
01276 }
01277
01278
01279 DomainDecompAlgo *
01280 FEM_ObjectBroker::getNewDomainDecompAlgo(int classTag)
01281 {
01282 switch(classTag) {
01283 case DomDecompALGORITHM_TAGS_DomainDecompAlgo:
01284 return new DomainDecompAlgo();
01285
01286 default:
01287 opserr << "FEM_ObjectBroker::getNewDomainDecompAlgo - ";
01288 opserr << " - no DomainDecompAlgo type exists for class tag ";
01289 opserr << classTag << endln;
01290 return 0;
01291
01292 }
01293 }
01294
01295
01296 StaticIntegrator *
01297 FEM_ObjectBroker::getNewStaticIntegrator(int classTag)
01298 {
01299 switch(classTag) {
01300 case INTEGRATOR_TAGS_LoadControl:
01301 return new LoadControl(1.0,1,1.0,.10);
01302
01303 #ifdef _PARALLEL_PROCESSING
01304 case INTEGRATOR_TAGS_DistributedDisplacementControl:
01305 return new DistributedDisplacementControl();
01306 #endif
01307
01308 case INTEGRATOR_TAGS_ArcLength:
01309 return new ArcLength(1.0);
01310
01311
01312 default:
01313 opserr << "FEM_ObjectBroker::getNewStaticIntegrator - ";
01314 opserr << " - no StaticIntegrator type exists for class tag ";
01315 opserr << classTag << endln;
01316 return 0;
01317
01318 }
01319 }
01320
01321
01322 TransientIntegrator *
01323 FEM_ObjectBroker::getNewTransientIntegrator(int classTag)
01324 {
01325 switch(classTag) {
01326 case INTEGRATOR_TAGS_Newmark:
01327 return new Newmark();
01328
01329 case INTEGRATOR_TAGS_CentralDifferenceNoDamping:
01330 return new CentralDifferenceNoDamping();
01331
01332 case INTEGRATOR_TAGS_CentralDifferenceAlternative:
01333 return new CentralDifferenceAlternative();
01334
01335 default:
01336 opserr << "FEM_ObjectBroker::getNewTransientIntegrator - ";
01337 opserr << " - no TransientIntegrator type exists for class tag ";
01338 opserr << classTag << endln;
01339 return 0;
01340
01341 }
01342 }
01343
01344
01345 IncrementalIntegrator *
01346 FEM_ObjectBroker::getNewIncrementalIntegrator(int classTag)
01347 {
01348 switch(classTag) {
01349 case INTEGRATOR_TAGS_LoadControl:
01350 return new LoadControl(1.0,1,1.0,1.0);
01351
01352
01353 case INTEGRATOR_TAGS_ArcLength:
01354 return new ArcLength(1.0);
01355
01356
01357 case INTEGRATOR_TAGS_Newmark:
01358 return new Newmark();
01359
01360 #ifdef _PARALLEL_PROCESSING
01361 case INTEGRATOR_TAGS_DistributedDisplacementControl:
01362 return new DistributedDisplacementControl();
01363 #endif
01364
01365 default:
01366 opserr << "FEM_ObjectBroker::getNewIncrementalIntegrator - ";
01367 opserr << " - no IncrementalIntegrator type exists for class tag ";
01368 opserr << classTag << endln;
01369 return 0;
01370
01371 }
01372 }
01373
01374
01375 LinearSOESolver *
01376 FEM_ObjectBroker::getNewLinearSolver(void)
01377 {
01378 return lastLinearSolver;
01379 }
01380
01381 LinearSOE *
01382 FEM_ObjectBroker::getNewLinearSOE(int classTagSOE,
01383 int classTagSolver)
01384 {
01385 LinearSOE *theSOE =0;
01386
01387 FullGenLinSolver *theGenSolver =0;
01388 BandGenLinSolver *theGenBandSolver =0;
01389 BandSPDLinSolver *theBandSPDSolver =0;
01390 ProfileSPDLinSolver *theProfileSPDSolver =0;
01391 SuperLU *theSparseGenLinSolver =0;
01392
01393 #ifdef _PETSC
01394 PetscSolver *thePetscSolver = 0;
01395 #endif
01396
01397 #ifdef _PARALLEL_PROCESSING
01398 DistributedSuperLU *theDistributedSparseGenLinSolver =0;
01399 DistributedDiagonalSolver *theDistributedDiagonalSolver =0;
01400 #ifdef _MUMPS
01401 MumpsParallelSolver *theMumpsSolver = 0;
01402 #endif
01403 #endif
01404
01405
01406
01407
01408
01409
01410
01411
01412
01413
01414
01415
01416
01417
01418
01419
01420
01421
01422 switch(classTagSOE) {
01423 case LinSOE_TAGS_FullGenLinSOE:
01424
01425 if (classTagSolver == SOLVER_TAGS_FullGenLinLapackSolver) {
01426 theGenSolver = new FullGenLinLapackSolver();
01427 theSOE = new FullGenLinSOE(*theGenSolver);
01428 lastLinearSolver = theGenSolver;
01429 return theSOE;
01430 } else {
01431 opserr << "FEM_ObjectBroker::getNewLinearSOE - ";
01432 opserr << " - no FullGenLinSOESolver type exists for class tag ";
01433 opserr << classTagSolver << endln;
01434 return 0;
01435 }
01436
01437
01438 case LinSOE_TAGS_BandGenLinSOE:
01439
01440 if (classTagSolver == SOLVER_TAGS_BandGenLinLapackSolver) {
01441 theGenBandSolver = new BandGenLinLapackSolver();
01442 theSOE = new BandGenLinSOE(*theGenBandSolver);
01443 lastLinearSolver = theGenBandSolver;
01444 return theSOE;
01445 } else {
01446 opserr << "FEM_ObjectBroker::getNewLinearSOE - ";
01447 opserr << " - no BandGenLinSolver type exists for class tag ";
01448 opserr << classTagSolver << endln;
01449 return 0;
01450 }
01451
01452 case LinSOE_TAGS_BandSPDLinSOE:
01453
01454 if (classTagSolver == SOLVER_TAGS_BandSPDLinLapackSolver) {
01455 theBandSPDSolver = new BandSPDLinLapackSolver();
01456 theSOE = new BandSPDLinSOE(*theBandSPDSolver);
01457 lastLinearSolver = theBandSPDSolver;
01458 return theSOE;
01459 } else {
01460 opserr << "FEM_ObjectBroker::getNewLinearSOE - ";
01461 opserr << " - no BandSPDLinSOESolver type exists for class tag ";
01462 opserr << classTagSolver << endln;
01463 return 0;
01464 }
01465
01466 case LinSOE_TAGS_ProfileSPDLinSOE:
01467
01468 if (classTagSolver == SOLVER_TAGS_ProfileSPDLinDirectSolver) {
01469 theProfileSPDSolver = new ProfileSPDLinDirectSolver();
01470 theSOE = new ProfileSPDLinSOE(*theProfileSPDSolver);
01471 lastLinearSolver = theProfileSPDSolver;
01472 return theSOE;
01473 } else if (classTagSolver == SOLVER_TAGS_ProfileSPDLinSubstrSolver) {
01474 theProfileSPDSolver = new ProfileSPDLinSubstrSolver();
01475 theSOE = new ProfileSPDLinSOE(*theProfileSPDSolver);
01476 lastLinearSolver = theProfileSPDSolver;
01477 return 0;
01478 }
01479 else {
01480 opserr << "FEM_ObjectBroker::getNewLinearSOE - ";
01481 opserr << " - no ProfileSPD_LinSolver type exists for class tag ";
01482 opserr << classTagSolver << endln;
01483 return 0;
01484 }
01485
01486
01487 #ifdef _PETSC
01488 case LinSOE_TAGS_PetscSOE:
01489
01490 if (classTagSolver == SOLVER_TAGS_PetscSolver) {
01491 thePetscSolver = new PetscSolver();
01492 theSOE = new PetscSOE(*thePetscSolver);
01493 return theSOE;
01494 } else {
01495 opserr << "FEM_ObjectBroker::getNewLinearSOE - ";
01496 opserr << " - no PetscSolver type exists for class tag ";
01497 opserr << classTagSolver << endln;
01498 return 0;
01499 }
01500 #endif
01501
01502 #ifdef _PARALLEL_PROCESSING
01503
01504 #ifdef _MUMPS
01505 case LinSOE_TAGS_MumpsParallelSOE:
01506 if (classTagSolver == SOLVER_TAGS_MumpsParallelSolver) {
01507 theMumpsSolver = new MumpsParallelSolver();
01508 theSOE = new MumpsParallelSOE(*theMumpsSolver);
01509 lastLinearSolver = theMumpsSolver;
01510 return theSOE;
01511 } else {
01512 opserr << "FEM_ObjectBroker::getNewLinearSOE - ";
01513 opserr << " - no DistributedBandGenLinSolver type exists for class tag ";
01514 opserr << classTagSolver << endln;
01515 return 0;
01516 }
01517 #endif
01518
01519 case LinSOE_TAGS_DistributedBandGenLinSOE:
01520
01521 if (classTagSolver == SOLVER_TAGS_BandGenLinLapackSolver) {
01522 theGenBandSolver = new BandGenLinLapackSolver();
01523 theSOE = new DistributedBandGenLinSOE(*theGenBandSolver);
01524 lastLinearSolver = theGenBandSolver;
01525 return theSOE;
01526 } else {
01527 opserr << "FEM_ObjectBroker::getNewLinearSOE - ";
01528 opserr << " - no DistributedBandGenLinSolver type exists for class tag ";
01529 opserr << classTagSolver << endln;
01530 return 0;
01531 }
01532
01533 case LinSOE_TAGS_DistributedBandSPDLinSOE:
01534
01535 if (classTagSolver == SOLVER_TAGS_BandSPDLinLapackSolver) {
01536 theBandSPDSolver = new BandSPDLinLapackSolver();
01537 theSOE = new DistributedBandSPDLinSOE(*theBandSPDSolver);
01538 lastLinearSolver = theBandSPDSolver;
01539 return theSOE;
01540 } else {
01541 opserr << "FEM_ObjectBroker::getNewLinearSOE - ";
01542 opserr << " - no DistributedBandSPDLinSolver type exists for class tag ";
01543 opserr << classTagSolver << endln;
01544 return 0;
01545 }
01546
01547
01548 case LinSOE_TAGS_DistributedProfileSPDLinSOE:
01549
01550 if (classTagSolver == SOLVER_TAGS_ProfileSPDLinDirectSolver) {
01551 theProfileSPDSolver = new ProfileSPDLinDirectSolver();
01552 theSOE = new DistributedProfileSPDLinSOE(*theProfileSPDSolver);
01553 lastLinearSolver = theProfileSPDSolver;
01554 return theSOE;
01555 } else if (classTagSolver == SOLVER_TAGS_ProfileSPDLinSubstrSolver) {
01556 theProfileSPDSolver = new ProfileSPDLinSubstrSolver();
01557 theSOE = new DistributedProfileSPDLinSOE(*theProfileSPDSolver);
01558 lastLinearSolver = theProfileSPDSolver;
01559 return 0;
01560 }
01561 else {
01562 opserr << "FEM_ObjectBroker::getNewLinearSOE - ";
01563 opserr << " - no ProfileSPD_LinSolver type exists for class tag ";
01564 opserr << classTagSolver << endln;
01565 return 0;
01566 }
01567
01568 case LinSOE_TAGS_DistributedDiagonalSOE:
01569
01570 if (classTagSolver == SOLVER_TAGS_DistributedDiagonalSolver) {
01571 theDistributedDiagonalSolver = new DistributedDiagonalSolver();
01572 theSOE = new DistributedDiagonalSOE(*theDistributedDiagonalSolver);
01573 lastLinearSolver = theDistributedDiagonalSolver;
01574 return theSOE;
01575 } else {
01576 opserr << "FEM_ObjectBroker::getNewLinearSOE - ";
01577 opserr << " - no DistributedSparseGenLinSolverSolver type exists for class tag ";
01578 opserr << classTagSolver << endln;
01579 return 0;
01580 }
01581
01582 case LinSOE_TAGS_DistributedSparseGenColLinSOE:
01583
01584 if (classTagSolver == SOLVER_TAGS_SuperLU) {
01585 theSparseGenLinSolver = new SuperLU();
01586 theSOE = new DistributedSparseGenColLinSOE(*theSparseGenLinSolver);
01587 lastLinearSolver = theSparseGenLinSolver;
01588 return theSOE;
01589 } else if (classTagSolver == SOLVER_TAGS_DistributedSuperLU) {
01590 theDistributedSparseGenLinSolver = new DistributedSuperLU();
01591 theSOE = new DistributedSparseGenColLinSOE(*theDistributedSparseGenLinSolver);
01592 lastLinearSolver = theSparseGenLinSolver;
01593 return theSOE;
01594 } else {
01595 opserr << "FEM_ObjectBroker::getNewLinearSOE - ";
01596 opserr << " - no DistributedSparseGenLinSolverSolver type exists for class tag ";
01597 opserr << classTagSolver << endln;
01598 return 0;
01599 }
01600
01601 #else
01602 case LinSOE_TAGS_SparseGenColLinSOE:
01603
01604 if (classTagSolver == SOLVER_TAGS_SuperLU) {
01605 theSparseGenLinSolver = new SuperLU();
01606 theSOE = new SparseGenColLinSOE(*theSparseGenLinSolver);
01607 lastLinearSolver = theSparseGenLinSolver;
01608 return theSOE;
01609 } else {
01610 opserr << "FEM_ObjectBroker::getNewLinearSOE - ";
01611 opserr << " - no SparseGenLinSolverSolver type exists for class tag ";
01612 opserr << classTagSolver << endln;
01613 return 0;
01614 }
01615
01616 #endif
01617
01618 default:
01619 opserr << "FEM_ObjectBroker::getNewLinearSOE - ";
01620 opserr << " - no LinearSOE type exists for class tag ";
01621 opserr << classTagSOE << endln;
01622 return 0;
01623
01624
01625 }
01626 }
01627
01628
01629
01630
01631 DomainSolver *
01632 FEM_ObjectBroker::getNewDomainSolver(void)
01633 {
01634 return lastDomainSolver;
01635 }
01636
01637 LinearSOE *
01638 FEM_ObjectBroker::getPtrNewDDLinearSOE(int classTagSOE,
01639 int classTagDDSolver)
01640 {
01641 ProfileSPDLinSubstrSolver *theProfileSPDSolver =0;
01642
01643 switch(classTagSOE) {
01644 case LinSOE_TAGS_ProfileSPDLinSOE:
01645
01646 if (classTagDDSolver == SOLVER_TAGS_ProfileSPDLinSubstrSolver) {
01647 theProfileSPDSolver = new ProfileSPDLinSubstrSolver();
01648 LinearSOE *theSOE = new ProfileSPDLinSOE(*theProfileSPDSolver);
01649 lastDomainSolver = theProfileSPDSolver;
01650 return theSOE;
01651 }
01652 else {
01653 opserr << "FEM_ObjectBroker::getNewLinearSOE - ";
01654 opserr << " - no ProfileSPD Domain Solver type exists for class tag ";
01655 opserr << classTagDDSolver << endln;
01656 return 0;
01657 }
01658
01659
01660 default:
01661 opserr << "FEM_ObjectBroker::getNewLinearSOE - ";
01662 opserr << " - no LinearSOE type exists for class tag ";
01663 opserr << classTagSOE << endln;
01664 return 0;
01665
01666 }
01667 }
01668
01669
01670 DomainDecompositionAnalysis *
01671 FEM_ObjectBroker::getNewDomainDecompAnalysis(int classTag,
01672 Subdomain &theSubdomain)
01673 {
01674 switch(classTag) {
01675 case DomDecompANALYSIS_TAGS_DomainDecompositionAnalysis:
01676 return new DomainDecompositionAnalysis(theSubdomain);
01677
01678 #ifdef _PARALLEL_PROCESSING
01679 case ANALYSIS_TAGS_StaticDomainDecompositionAnalysis:
01680 return new StaticDomainDecompositionAnalysis(theSubdomain);
01681
01682 case ANALYSIS_TAGS_TransientDomainDecompositionAnalysis:
01683 return new TransientDomainDecompositionAnalysis(theSubdomain);
01684 #endif
01685
01686 default:
01687 opserr << "ObjectBroker::getNewDomainDecompAnalysis ";
01688 opserr << " - no DomainDecompAnalysis type exists for class tag " ;
01689 opserr << classTag << endln;
01690 return 0;
01691
01692 }
01693 }
01694
01695
01696 Subdomain *
01697 FEM_ObjectBroker::getSubdomainPtr(int classTag)
01698 {
01699 opserr << "FEM_ObjectBroker: NOT IMPLEMENTED YET";
01700 return 0;
01701 }
01702
01703
01704 int
01705 FEM_ObjectBroker::addUniaxialMaterial(int classTag,
01706 const char *lib,
01707 const char *funcName,
01708 UniaxialMaterial *(*funcPtr)(void))
01709 {
01710
01711
01712 UniaxialPackage *matCommands = theUniaxialPackage;
01713 bool found = false;
01714 while (matCommands != NULL && found == false) {
01715 if ((strcmp(lib, matCommands->libName) == 0) && (strcmp(funcName, matCommands->funcName) == 0)) {
01716 return 0;
01717 }
01718 }
01719
01720
01721
01722
01723
01724 void *libHandle;
01725 if (funcPtr == 0) {
01726 if (getLibraryFunction(lib, funcName, &libHandle, (void **)&funcPtr) != 0) {
01727 opserr << "FEM_ObjectBroker::addUniaxialMaterial - could not find function\n";
01728 return -1;
01729 }
01730 }
01731
01732
01733
01734
01735
01736 char *libNameCopy = new char[strlen(lib)+1];
01737 char *funcNameCopy = new char[strlen(funcName)+1];
01738 UniaxialPackage *theMat = new UniaxialPackage;
01739 if (libNameCopy == 0 || funcNameCopy == 0 || theMat == 0) {
01740 opserr << "FEM_ObjectBroker::addUniaxialMaterial - could not add lib, out of memory\n";
01741 return -1;
01742 }
01743 strcpy(libNameCopy, lib);
01744 strcpy(funcNameCopy, funcName);
01745
01746 theMat->classTag = classTag;
01747 theMat->funcName = funcNameCopy;
01748 theMat->libName = libNameCopy;
01749 theMat->funcPtr = funcPtr;
01750 theMat->next = theUniaxialPackage;
01751 theUniaxialPackage = theMat;
01752
01753 return 0;
01754
01755 }