OOFEM 3.0
Loading...
Searching...
No Matches
eigenvaluedynamic.C
Go to the documentation of this file.
1/*
2 *
3 * ##### ##### ###### ###### ### ###
4 * ## ## ## ## ## ## ## ### ##
5 * ## ## ## ## #### #### ## # ##
6 * ## ## ## ## ## ## ## ##
7 * ## ## ## ## ## ## ## ##
8 * ##### ##### ## ###### ## ##
9 *
10 *
11 * OOFEM : Object Oriented Finite Element Code
12 *
13 * Copyright (C) 1993 - 2025 Borek Patzak
14 *
15 *
16 *
17 * Czech Technical University, Faculty of Civil Engineering,
18 * Department of Structural Mechanics, 166 29 Prague, Czech Republic
19 *
20 * This library is free software; you can redistribute it and/or
21 * modify it under the terms of the GNU Lesser General Public
22 * License as published by the Free Software Foundation; either
23 * version 2.1 of the License, or (at your option) any later version.
24 *
25 * This program is distributed in the hope that it will be useful,
26 * but WITHOUT ANY WARRANTY; without even the implied warranty of
27 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
28 * Lesser General Public License for more details.
29 *
30 * You should have received a copy of the GNU Lesser General Public
31 * License along with this library; if not, write to the Free Software
32 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301 USA
33 */
34
35#include <oofemcfg.h>
37#include "timestep.h"
38#include "floatmatrix.h"
39#include "floatarray.h"
40#include "exportmodulemanager.h"
41#include "verbose.h"
42#include "classfactory.h"
43#include "datastream.h"
44#include "geneigvalsolvertype.h"
45#include "contextioerr.h"
46#include "classfactory.h"
47#include "dofmanager.h"
48#include "dof.h"
49#include "domain.h"
51
52#ifdef __OOFEG
53 #include "oofeggraphiccontext.h"
54#endif
55
56namespace oofem {
58
59
60EigenValueDynamic :: EigenValueDynamic(int i, EngngModel *master) : EngngModel(i, master)
61{
62 numberOfSteps = 1;
63 ndomains = 1;
64}
65
66
67NumericalMethod *EigenValueDynamic :: giveNumericalMethod(MetaStep *mStep)
68{
69 if ( !nMethod ) {
70 nMethod = classFactory.createGeneralizedEigenValueSolver(solverType, this->giveDomain(1), this);
71 if ( !nMethod ) {
72 OOFEM_ERROR("solver creation failed");
73 }
74 }
75
76 return nMethod.get();
77}
78
79
80void
81EigenValueDynamic :: initializeFrom(InputRecord &ir)
82{
83 //EngngModel::instanciateFrom (ir);
84
86 this->field = std::make_unique<EigenVectorPrimaryField>(this, 1, FT_Displacements, numberOfRequiredEigenValues);
87
88 // numberOfSteps set artificially to numberOfRequiredEigenValues
89 // in order to allow
90 // use restoreContext function for different eigenValues
91 // numberOfSteps = numberOfRequiredEigenValues;
92 numberOfSteps = 1;
93
95 if ( rtolv < 1.e-12 ) {
96 rtolv = 1.e-12;
97 } else if ( rtolv > 0.01 ) {
98 rtolv = 0.01;
99 }
100
101 int val = 0;
104
105 val = 0; //Default Skyline
108
110
111 if ( suppressOutput ) {
112 printf("Suppressing output.\n");
113 } else {
114 if ( ( outputStream = fopen(this->dataOutputFileName.c_str(), "w") ) == NULL ) {
115 OOFEM_ERROR("Can't open output file %s", this->dataOutputFileName.c_str());
116 }
117
118 fprintf(outputStream, "%s", PRG_HEADER);
119 fprintf(outputStream, "\nStarting analysis on: %s\n", ctime(& this->startTime) );
120 fprintf(outputStream, "%s\n", simulationDescription.c_str());
121 }
122}
123
124
125int EigenValueDynamic :: giveUnknownDictHashIndx(ValueModeType mode, TimeStep *tStep)
126{
127 return tStep->giveNumber() % this->numberOfRequiredEigenValues;
128}
129
130
131double EigenValueDynamic :: giveUnknownComponent(ValueModeType mode, TimeStep *tStep, Domain *d, Dof *dof)
132{
133 return field->giveUnknownValue(dof, mode, tStep);
134}
135
136
137TimeStep *EigenValueDynamic :: giveNextStep()
138{
139 int istep = giveNumberOfFirstStep();
140 StateCounterType counter = 1;
141
142 if ( currentStep ) {
143 istep = currentStep->giveNumber() + 1;
144 counter = currentStep->giveSolutionStateCounter() + 1;
145 }
146
147 previousStep = std :: move(currentStep);
148 currentStep = std::make_unique<TimeStep>(istep, this, 1, ( double ) istep, 0., counter);
149
150 return currentStep.get();
151}
152
153
154void EigenValueDynamic :: solveYourself()
155{
156 this->timer.startTimer(EngngModelTimer :: EMTT_AnalysisTimer);
157
158 TimeStep *tStep = this->giveNextStep();
159 this->updateAttributes( this->giveCurrentMetaStep() );
160
161 OOFEM_LOG_INFO("Assembling stiffness and mass matrices\n");
162
163 FloatMatrix eigVec;
164 {
165 std :: unique_ptr< SparseMtrx > stiffnessMatrix;
166 std :: unique_ptr< SparseMtrx > massMatrix;
167
168 stiffnessMatrix = classFactory.createSparseMtrx(sparseMtrxType);
169 stiffnessMatrix->buildInternalStructure( this, 1, EModelDefaultEquationNumbering() );
170
171 massMatrix = classFactory.createSparseMtrx(sparseMtrxType);
172 massMatrix->buildInternalStructure( this, 1, EModelDefaultEquationNumbering() );
173
174 this->assemble( *stiffnessMatrix, tStep, TangentAssembler(TangentStiffness), EModelDefaultEquationNumbering(), this->giveDomain(1) );
175 this->assemble( *massMatrix, tStep, MassMatrixAssembler(), EModelDefaultEquationNumbering(), this->giveDomain(1) );
176
177 this->giveNumericalMethod( this->giveMetaStep( tStep->giveMetaStepNumber() ) );
178 OOFEM_LOG_INFO("Solving ...\n");
179 nMethod->solve(*stiffnessMatrix, *massMatrix, eigVal, eigVec, rtolv, numberOfRequiredEigenValues);
180 }
181 this->field->updateAll(eigVec, EModelDefaultEquationNumbering());
182
183 this->terminate( tStep );
184
185 double steptime = this->giveSolutionStepTime();
186 OOFEM_LOG_INFO("EngngModel info: user time consumed by solution: %.2fs\n", steptime);
187}
188
189
190void EigenValueDynamic :: updateYourself(TimeStep *tStep)
191{ }
192
193
194void EigenValueDynamic :: doStepOutput(TimeStep *tStep)
195{
196 if ( !suppressOutput ) {
197 this->printOutputAt(this->giveOutputStream(), tStep);
198 fflush( this->giveOutputStream() );
199 }
200
201 for ( int i = 1; i <= numberOfRequiredEigenValues; i++ ) {
202 // export using export manager
203 tStep->setTime( ( double ) i ); // we use time as intrinsic eigen value index
204 tStep->setNumber(i);
205 exportModuleManager.doOutput(tStep);
206 }
207}
208
209
210void EigenValueDynamic :: printOutputAt(FILE *file, TimeStep *tStep)
211{
212 Domain *domain = this->giveDomain(1);
213
214 // print loadcase header
215 fprintf(file, "\nOutput for time %.3e \n\n", 1.0);
216 // print eigen values on output
217 fprintf(file, "\n\nEigen Values (Omega^2) are:\n-----------------\n");
218
219 for ( int i = 1; i <= numberOfRequiredEigenValues; i++ ) {
220 fprintf(file, "%15.8e ", eigVal.at(i) );
221 if ( ( i % 5 ) == 0 ) {
222 fprintf(file, "\n");
223 }
224 }
225
226 fprintf(file, "\n\n");
227
228 for ( int i = 1; i <= numberOfRequiredEigenValues; i++ ) {
229 fprintf(file, "\nOutput for eigen value no. %.3e \n", ( double ) i);
230 fprintf(file, "Printing eigen vector no. %d, corresponding eigen value is %15.8e\n\n", i, eigVal.at(i) );
231 tStep->setTime( ( double ) i ); // we use time as intrinsic eigen value index
232 tStep->setNumber(i);
233
234 if ( this->requiresUnknownsDictionaryUpdate() ) {
235 for ( auto &dman : domain->giveDofManagers() ) {
236 this->updateDofUnknownsDictionary(dman.get(), tStep);
237 }
238 }
239
240
241 for ( auto &dman : domain->giveDofManagers() ) {
242 dman->updateYourself(tStep);
243 dman->printOutputAt(file, tStep);
244 }
245 }
246
247 double utsec = this->timer.getUtime(EngngModelTimer :: EMTT_AnalysisTimer);
248 fprintf(file, "\nUser time consumed by solution step: %.3f [s]\n\n", utsec);
249}
250
251
252void EigenValueDynamic :: saveContext(DataStream &stream, ContextMode mode)
253{
254 EngngModel :: saveContext(stream, mode);
255
257 if ( ( iores = eigVal.storeYourself(stream) ) != CIO_OK ) {
258 THROW_CIOERR(iores);
259 }
260
261 this->field->saveContext(stream);
262}
263
264
265void EigenValueDynamic :: restoreContext(DataStream &stream, ContextMode mode)
266{
267 EngngModel :: restoreContext(stream, mode);
268
270 if ( ( iores = eigVal.restoreYourself(stream) ) != CIO_OK ) {
271 THROW_CIOERR(iores);
272 }
273
274 this->field->restoreContext(stream);
275}
276
277
278void EigenValueDynamic :: setActiveVector(int i)
279{
280 this->activeVector = i;
283 }
284
285 this->giveCurrentStep()->setNumber( activeVector );
286 this->giveCurrentStep()->setTime( ( double ) activeVector );
287}
288
289} // end namespace oofem
#define REGISTER_EngngModel(class)
std ::vector< std ::unique_ptr< DofManager > > & giveDofManagers()
Definition domain.h:427
std ::unique_ptr< EigenVectorPrimaryField > field
double rtolv
Relative tolerance.
NumericalMethod * giveNumericalMethod(MetaStep *mStep) override
Returns reference to receiver's numerical method.
GenEigvalSolverType solverType
std ::unique_ptr< SparseGeneralEigenValueSystemNM > nMethod
TimeStep * giveNextStep() override
Returns next time step (next to current step) of receiver.
void printOutputAt(FILE *file, TimeStep *tStep) override
virtual TimeStep * giveCurrentStep(bool force=false)
Definition engngm.h:717
std::string dataOutputFileName
Path to output stream.
Definition engngm.h:248
std::string simulationDescription
Definition engngm.h:339
EngngModel(int i, EngngModel *_master=NULL)
Definition engngm.C:99
std ::unique_ptr< TimeStep > previousStep
Previous time step.
Definition engngm.h:243
double giveSolutionStepTime()
Definition engngm.C:2005
virtual void updateDofUnknownsDictionary(DofManager *, TimeStep *)
Definition engngm.h:922
MetaStep * giveCurrentMetaStep()
Returns current meta step.
Definition engngm.C:1900
int ndomains
Number of receiver domains.
Definition engngm.h:215
int numberOfSteps
Total number of time steps.
Definition engngm.h:219
Domain * giveDomain(int n)
Definition engngm.C:1936
std ::unique_ptr< TimeStep > currentStep
Current time step.
Definition engngm.h:241
FILE * giveOutputStream()
Returns file descriptor of output file.
Definition engngm.C:1994
time_t startTime
Solution start time.
Definition engngm.h:271
MetaStep * giveMetaStep(int i)
Returns the i-th meta step.
Definition engngm.h:773
EngngModelTimer timer
E-model timer.
Definition engngm.h:279
virtual void terminate(TimeStep *tStep)
Definition engngm.C:741
ExportModuleManager exportModuleManager
Export module manager.
Definition engngm.h:260
EngngModel * master
Master e-model; if defined receiver is in maintained (slave) mode.
Definition engngm.h:274
virtual int requiresUnknownsDictionaryUpdate()
Definition engngm.h:908
bool suppressOutput
Flag for suppressing output to file.
Definition engngm.h:337
FILE * outputStream
Output stream.
Definition engngm.h:252
virtual int giveNumberOfFirstStep(bool force=false)
Definition engngm.h:763
virtual void updateAttributes(MetaStep *mStep)
Definition engngm.C:669
virtual bool hasField(InputFieldType id)=0
Returns true if record contains field identified by idString keyword.
int giveMetaStepNumber()
Returns receiver's meta step number.
Definition timestep.h:150
void setNumber(int i)
Set receiver's number.
Definition timestep.h:146
int giveNumber()
Returns receiver's number.
Definition timestep.h:144
void setTime(double newt)
Sets target and intrinsic time to be equal.
Definition timestep.h:172
#define THROW_CIOERR(e)
#define _IFT_EigenValueDynamic_nroot
#define _IFT_EigenValueDynamic_stype
#define _IFT_EigenValueDynamic_rtolv
#define _IFT_EngngModel_suppressOutput
Definition engngm.h:94
#define _IFT_EngngModel_smtype
Definition engngm.h:92
#define OOFEM_ERROR(...)
Definition error.h:79
#define IR_GIVE_OPTIONAL_FIELD(__ir, __value, __id)
Definition inputrecord.h:75
#define IR_GIVE_FIELD(__ir, __value, __id)
Definition inputrecord.h:67
#define OOFEM_LOG_INFO(...)
Definition logger.h:143
long ContextMode
Definition contextmode.h:43
FloatArrayF< N > assemble(const FloatArrayF< M > &x, int const (&c)[M])
Assemble components into zero matrix.
long StateCounterType
StateCounterType type used to indicate solution state.
ClassFactory & classFactory
OOFEM_EXPORT const char * PRG_HEADER
Definition oofemcfg.C:22

This page is part of the OOFEM-3.0 documentation. Copyright Copyright (C) 1994-2025 Borek Patzak Bořek Patzák
Project e-mail: oofem@fsv.cvut.cz
Generated at for OOFEM by doxygen 1.15.0 written by Dimitri van Heesch, © 1997-2011