Those data are very similar to those defined in “A” version of the post-processing. One added however, new methods to the “LoadCase” module to allow the post-processing of dynamic Results (SOL108 and SOL111 of Nastran).
In iterator “LoadCases::each”, a new proc object called “makeDynamLoop” loops on all the dynamic sub-cases (frequency outputs) for a given load case name. The three argument of this loop are
A String object containing the full name of the Nastran xdb file in which the dynamic Results will be read.
The Name of the Load Case for which Results shall be improved. This is also a String argument.
An integer argument corresponding to maximum number of dynamic sub-cases that can be stored in the DataBase. This parameter allows to prevent the DataBase memory to increase too much because it contains an excessive number of Results.
The first operation performed by “makeDynamLoop” is to build a list of sub-cases in sorted in order of increasing frequencies:
lcNames=[lcName] tmpList={} xdbInfos=db.getXdbLcInfos(fullXdbName) xdbInfos.each do |info| if (info[0]==lcName) then tmpList[info[4]]=info[1] end end scList=tmpList.sort
In the previous instructions, one first loads the information about load cases and sub-cases stored in the xdb Result file. Then, the sub-cases corresponding to the selected load case name are selected. Finally, they are sorted and stored in the Array “scList”.
Then, a loop is done on the list of sub-cases stored in “scList”. A new Array “scNames” containing a list of sub-cases is filled. Each time its size reaches the values specified by the proc argument, one reads the Results, yields them, and finally erases them from the DataBase. This is done as follows:
scNames=[] scList.each do |intId,scName| scNames << scName if (scNames.size==maxScNbr) then db.readXdb(fullXdbName,lcNames,scNames) scNames.each do |name| yield([db,lcName,name]) db.removeResults("SubCaseId",name) GC.start end scNames=[] end end
At the end, the remaining sub-cases are calculated the same way:
db.readXdb(fullXdbName,lcNames,scNames) scNames.each do |name| yield([db,lcName,name]) db.removeResults("SubCaseId",name) GC.start end GC.start end
An example of use of the “makeDynamLoop” proc follows:
when "SINUS_Z" then db=getDb("LAUNCH") fullXdbName=getXdbDirName()+"/sol111_ri_xyz.xdb" makeDynamLoop.call(fullXdbName,"SINUS_Z",30)
In this case, the Results of “SINUS_Z” load case are required, and the maximum number of sub-cases loaded simultaneously in the DataBase is 30. Note that this number should be chosen with care: if it is too small, many readings of the Nastran xdb file will be necessary which increases the disk access time. On the other hand, if the number is too big, a larger amount of memory might be necessary to store the Results in the DataBase. This is important if you have limited resources. It is the responsibility of “LoadCases” module manager to select an appropriate value of this integer parameter.
Note that we voluntarily limit the example of dynamic Results post-processing to a simple extraction from an xdb file. Actually, the possibilities of FeResPost are larger that. For example, it should be possible to read simultaneously the Results for different load cases as “SINUS_X”, “SINUS_Y” and “SINUS_Z” and to yield linear combinations of these elementary Results for the different frequency outputs.