CFD Online Discussion Forums

CFD Online Discussion Forums (https://www.cfd-online.com/Forums/)
-   STAR-CCM+ (https://www.cfd-online.com/Forums/star-ccm/)
-   -   Automatically export all reports in batch (https://www.cfd-online.com/Forums/star-ccm/90846-automatically-export-all-reports-batch.html)

f-w July 21, 2011 20:03

Automatically export all reports in batch
 
Hello,

I typically run many simulations in batch mode with accompanying java macros that set up the conditions; these simulations have many reports. I'm looking for a way to export all reports after simulation convergence (in batch mode) into a csv file.

I have found a java macro which exports all reports to a csv file by running it manually on a simulation, but I need to run it automatically and only after convergence. Currently, the last command in my setup macros (which I use with each simulation in batch mode) is to RUN the simulation.

How do I go about running the report export macro before the simulation closes (and moves on to the next simulation) in batch mode?

Thanks

Attached is the report export macro I got from cd-adapco's java hut (author:Sangamesh)

Quote:

// STAR-CCM+ macro: Report_to_csv.java
package macro;

import java.util.*;
import java.io.*;
import java.nio.*;
import star.common.*;
import star.base.neo.*;
import star.base.report.*;
import star.flow.*;

public class Report_to_csv extends StarMacro {

BufferedWriter bwout = null;

public void execute() {

try {

Simulation simulation_0 = getActiveSimulation();

// Collecting the simualtion file name
String simulationName = simulation_0.getPresentationName();
simulation_0.println("Simulation Name:" + simulationName);

// Open Buffered Input and Output Readers
// Creating file with name "<sim_file_name>+report.csv"
bwout = new BufferedWriter(new FileWriter(resolvePath(simulationName +"report.csv")));
bwout.write("Report Name, Value, Unit, \n");

Collection<Report> reportCollection = simulation_0.getReportManager().getObjects();

for (Report thisReport : reportCollection){

String fieldLocationName = thisReport.getPresentationName();
Double fieldValue = thisReport.getReportMonitorValue();
String fieldUnits = thisReport.getUnits().toString();

// Printing to chek in output window
simulation_0.println("Field Location :" + fieldLocationName);
simulation_0.println(" Field Value :" + fieldValue);
simulation_0.println(" Field Units :" + fieldUnits);
simulation_0.println("");

// Write Output file as "sim file name"+report.csv
bwout.write( fieldLocationName + ", " +fieldValue + ", " + fieldUnits +"\n");

}
bwout.close();

} catch (IOException iOException) {
}

}
}

f-w July 25, 2011 19:51

I forgot that I can play a macro from within a macro. All I had to do was add the following line to the end of my conditioning macro:

new StarScript(getActiveSimulation(),new java.io.File(resolvePath("Report_to_csv.java"))).p lay();

cbisw August 3, 2011 09:14

Not 100% sure if I understand what you are doing. Just run a macro once the simulation run finishes? I wrote a couple of macros a few months ago to do stuff after each iteration or timestep, maybe they are helpful to you.

First I toyed around with the observer pattern:

Quote:


public
class ObserverTest extends StarMacro {

publicvoid execute() {

Simulation sim = getActiveSimulation();

SimulationIterator simIt = sim.getSimulationIterator();
NeoObservable simObs = simIt.getIterationObservable();
MyObs myObs =
new MyObs(sim, simIt);
simObs.addObserver(myObs);

}

class MyObs extends IterationNotifier.Receiver {

private Simulation sim;
private SimulationIterator simIt;

MyObs(Simulation sim, SimulationIterator simIt) {
this.sim = sim;
this.simIt = simIt;
}

publicvoid update(Observable o, Object msg) {

sim.println("Observer has been notified");
// do whatever you want here

// e.g. check whether convergence has been reached

// and do stuff accordingly


}

}
}

Then I used another approach by making my macro run the simulation itself timestep by timestep. You would probably have to adjust your stopping criteria since you obviously have your own ones based on convergence. I simplified it and put comments where you can do things a) after every step and b) after last step:

Quote:


// execute() is called by Star-CCM+ when macro is run
publicvoid execute() {



System.out.println("MACRO> Macro XYZ has been started.");



// SET UP SIMULATION



// references to current simulation and solution
sim = getActiveSimulation();
out.println("Active simulation is '"+sim.getPresentationName()+"'.");
sol = sim.getSolution();



// initialize solution if necessary for starting values
// WARNING: not initializing the solution will cause the macro to fail because
// the number of points cannot be extracted the way it is done here
if( sol.isInitialized() == false ) {
out.println("Solution not initialized, initializing...");
sol.initializeSolution();
}



// status
int startTimelevel = sim.getSimulationIterator().getCurrentTimeLevel();
int startIteration = sim.getSimulationIterator().getCurrentIteration();
double timestep = ((ImplicitUnsteadySolver)sim.getSolverManager().getSolver(ImplicitUnsteadySolv er.class)).getTimeStep().getValue();



// set the current iteration
iteration = startIteration;
timelevel = startTimelevel;



// INITIALIZATION DONE



// RUN SINGLE TIME STEPS AND DO STUFF



do {



// run a single time step and wait until it has completed.
long timeBeforeStep = System.nanoTime();
sim.getSimulationIterator().run(1,true);



// output some information
iteration = sim.getSimulationIterator().getCurrentIteration();
out.println("Iteration: "+iteration);
out.println("Timelevel: "+sim.getSimulationIterator().getCurrentTimeLevel());



// do whatever you want to do each step here



long timeAfterStep = System.nanoTime();
long timeRequirement = timeAfterStep - timeBeforeStep;
out.println("Total time for this iteration: "+timeRequirement + " ns.");



} while (IsCriteriaSatisfied(sim) == false);



// at this point, any of the stopping criteria has been satisfied, execute() returns
// do whatever you want to do after simulation has ended here
out.println("MACRO> Stopping criterion met, quitting macro.");
out.close();
return;



}



// returns true if any stopping criteria has been met, taking into account the three default stopping criteria
privateboolean IsCriteriaSatisfied(Simulation Sim) {



PhysicalTimeStoppingCriterion physTimeCrit = ((PhysicalTimeStoppingCriterion) Sim.getSolverStoppingCriterionManager().getSolverS toppingCriterion("Maximum Physical Time"));
StepStoppingCriterion stepCrit = ((StepStoppingCriterion) Sim.getSolverStoppingCriterionManager().getSolverS toppingCriterion("Maximum Steps"));
AbortFileStoppingCriterion abortFileCrit = (AbortFileStoppingCriterion) Sim.getSolverStoppingCriterionManager().getSolverS toppingCriterion("Stop File");



if( physTimeCrit.getIsUsed() ) {
if( physTimeCrit.getIsSatisfied() ) {
Sim.println("MACRO> PhysicalTimeStoppingCriterion met");
returntrue;
}
}



if( stepCrit.getIsUsed() ) {
if( stepCrit.getIsSatisfied() ) {
Sim.println("MACRO> StepStoppingCriterion met");
returntrue;
}
}



if( abortFileCrit.getIsUsed() ) {
if( abortFileCrit.getIsSatisfied() ) {
Sim.println("MACRO> AbortFileStoppingCriterion met");
returntrue;
}
}



returnfalse;


}


f-w August 3, 2011 19:05

Thanks for your contribution Sebastian, but as you can read from my 2nd post, I figured it out ...

cbisw August 4, 2011 01:02

Oh alright, that came across like some kind of extra information. Guess I shouldn't try to answer threads in a hurry shortly before calling it a day ;)

Sergi August 23, 2016 07:04

This thread that it already has some time it's quite useful to export the reports into an excel spreadsheet in batch mode. The code in the 1st post worked brilliantly to me to export all the reports from my simulations.

But here's my question and hopefully someone can help me to find an answer because my Java knowledge is 0 and I do not know how to find or write myself the right code to export the Plots monitor into an excel file.

The thing is that I have a series of simulations and I would like to generate an excel file with the plots results for each simulation in batch mode.

Hope that I made myself clear, so if you need some extra info, please let me know it.

Any help or guidance on this, I would really appreciate it!:)

Dumbledoge September 24, 2019 09:21

Export single reports, java api issues
 
Hello !

I am sorry I have to revive this thread again, but in case someone is looking for a way to extract single Reports by specifying the Report Name, this might help you:

Code:

// STAR-CCM+ macro: reportExtractor.java
package macro;
//
import java.util.*;
import java.io.*;
import java.nio.*;
import star.common.*;
import star.base.neo.*;
import star.base.report.*;
import star.flow.*;

public class reportExtractor extends StarMacro {
//
BufferedWriter writer = null;
//
public void execute() {
//
try {

Simulation activeSimulation = getActiveSimulation();

// Collecting the simualtion file name
String simulationName = activeSimulation.getPresentationName();
activeSimulation.println("Simulation Name:" + simulationName);

// Creating file with name "<sim_file_name>+report.csv"
writer = new BufferedWriter(new FileWriter(resolvePath(simulationName +"_report.csv")));
writer.write("Report Name, Value, Unit, \n");

Report testReport;

testReport = activeSimulation.getReportManager().getReport("Heat Flux of Contact Surfaces");

List<Report> reportCollection = new ArrayList<Report>();

reportCollection.add(testReport);


for (Report thisReport : reportCollection){

        String fieldLocationName = thisReport.getPresentationName();
        Double fieldValue = thisReport.getReportMonitorValue();
        String fieldUnits = thisReport.getUnits().toString();

// Printing to check in output window
        activeSimulation.println("Field Location: " + fieldLocationName);
        activeSimulation.println("Field Value: " + fieldValue);
        activeSimulation.println("Field Units: " + fieldUnits);
        activeSimulation.println("");

// Write Output file as "sim file name"+report.csv
        writer.write( fieldLocationName + ", " +fieldValue + ", " + fieldUnits +"\n");
//
    }
    writer.close();
//
 } catch (IOException iOException) {
 }
//
 }
 }


Marcel95 May 24, 2022 12:00

Where is the .csv File ?
 
Can someone tell me where i will find the .csv file after running the macro??

I thought it would be at the same place as my simulation, but there is nothing.

bluebase May 25, 2022 05:51

if you do not specify an absolute path, the relative path points to the current work directory.


This should be the location from which the starccm binary is started.
If you are running windows, have a look into your home directory (such as C:/Users/Marcel/)




The sim object has a method which tells in which directory it is located. Here is an example to export all plots to the location of the sim file

Code:

Simulation simulation_0 = getActiveSimulation();         

String dir = simulation_0.getSessionDir(); //get the name of the simulation's directory
String sep = System.getProperty("file.separator"); //get the right separator for your operating system

for (StarPlot plot : simulation_0.getPlotManager().getObjects()) {
    plot.encode(resolvePath(dir + sep + plot.getPresentationName() + ".jpg"), "jpg", 800, 600);
}


cramr5 November 17, 2022 04:14

Quote:

Originally Posted by Marcel95 (Post 828584)
Can someone tell me where i will find the .csv file after running the macro??

I thought it would be at the same place as my simulation, but there is nothing.

I don't think it's where you said "This should be the location from which the starccm binary is started.
If you are running windows, have a look into your home directory (such as C:/Users/Marcel/)"

I tried and in my case it was at the folder where the .java macro was


All times are GMT -4. The time now is 06:51.