factors = array("SW_Density"=>1e6,
"SW_Utot"=>1e3,
"SW_Temperature"=>1e3,
"SW_Btot"=>1e-9,
"SW_Bx"=>1e-9,
"SW_By"=>1e-9,
"SW_Bz"=>1e-9
);
}
/*****************************************************************
* PUBLIC FUNCTIONS
*****************************************************************/
public function init() {
// DOM of SIMU RUNs chablon
$this->domTemplate = new DomDocument();
if (!$this->domTemplate->load( tmplGUMICS ))
return false;
$this->xpTemplate = new domxpath($this->domTemplate);
$this->runTemplate = $this->xpTemplate->query("//runID")->item(0);
// DOM of user RemoteParams
$this->domRemoteData = new DomDocument();
if (!$this->domRemoteData->load( USERWSDIR.'RemoteParams.xml' ))
return false;
$this->xpRemoteData = new domxpath($this->domRemoteData);
$this->json = file_get_contents(USERWSDIR.'runs.json');
}
// $obj ={"Object":"Earth","RunCount":"2",
// "SW_Density_value":"10","SW_Density_weight":"1","SW_Density_scale":"7","SW_Temperature_value":"100", ....}
public function getRun($obj)
{
$params = $this->makeParams($obj);
try {
$client = new SoapClient(wsdl_FMI,
array(
'wsdl_cache' => 0,
'trace' => 1,
'exceptions' => 0,
'soap_version'=>SOAP_1_2
));
}
catch (SoapFault $exception) {
error_log("Problem with WSDL".PHP_EOL.$exception->getMessage().PHP_EOL.$exception->getTraceAsString().PHP_EOL."File = ".$exception->getFile(),1,email);
$res = array('success' => false,'error' => $exception->getMessage());
}
try {
$data_json = $client->getMostRelevantRun($params);
$result = json_decode($data_json,true);
if (count($result["runs"]) > 0) {
$result = $this->changeJson($result);
$res = array('success' => true,'runs' => $result["runs"]);
file_put_contents(USERWSDIR.'runs.json',json_encode($res));
}
}
catch (Exception $e) {
error_log ($e->getMessage(),1,email);
$res = array('success' => false,'error' => $e->getMessage());
}
return $res;
}
public function addRuns($obj){
if (!$obj) return false;
else {
$this->runsId = (array)$obj;
$object = json_decode($this->json,true);
$simuRegion = $this->domRemoteData->getElementById('FMI_GUMICS_Earth_Magnetosphere');
foreach ( $this->runsId as $runId){
if ($this->domRemoteData->getElementById($runId) == null){
$newRun = $this->domRemoteData->importNode($this->runTemplate, true);
foreach ($object['runs'] as $r){
if ($r['ResourceID'] == $runId) $run=$r;
}
$newRun->setAttribute('xml:id', $run['ResourceID']);
$newRun->setAttribute('name', $run['ResourceName']);
$desc = $this->runTemplate->getAttribute('start_desc'). "Param_values:
";
foreach ($run['Param_values'] as $key => $value) {
$desc = $desc."".$key." ".$value."
";
}
$newRun->setAttribute('desc', $desc);
$newRun->removeAttribute('start_desc');
$datasets = $newRun->getElementsByTagName('dataset');
foreach ($datasets as $dataset){
$name = $dataset->getAttribute('name');
$datasetId = str_replace('SimulationRun','NumericalOutput',$run['ResourceID'].'/'.$name);
$dataset->setAttribute('xml:id', $datasetId);
$dataset->setAttribute('desc');
$params = $dataset->getElementsByTagName('parameter');
foreach($params as $param){
$paramName = $param->getAttribute('name');
// $datasetId = str_replace('SimulationRun','NumericalOutput',$datasetId);
switch ($paramName) {
case "H+ number density" : $paramName = "Density"; break;
case "H+ velocity" : $paramName = "Ux,Uy,Uz"; break;
case "H+ total velocity" : $paramName = "Utot"; break;
case "H+ thermal pressure" : $paramName = "Pressure"; break;
case "H+ temperature" : $paramName = "Temperature"; break;
}
$paramId = $this->param2ddSimu($datasetId.'/'.$paramName);
$param->setAttribute('xml:id', str_replace('_EARTH___n_T_Vx_Bx_By_Bz','',str_replace('earth_synth_stationary_','',$paramId)));
$param->setAttribute('parentID',$datasetId);
$param->setAttribute('needsArgs','1');
if ($param->hasChildNodes()) {
$components = $param->getElementsByTagName('component');
foreach ($components as $component){
$compName = $component->getAttribute('name');
$component->setAttribute('xml:id', str_replace('_EARTH___n_T_Vx_Bx_By_Bz','',str_replace('earth_synth_stationary_','',$paramId.'_'.$compName)));
$component->setAttribute('parentID',$datasetId);
$component->setAttribute('needsArgs','1');
}
}
}
}
$simuRegion->appendChild($newRun);
$this->domRemoteData->save(USERWSDIR.'RemoteParams.xml');
}
}
}
}
protected function makeParams($json)
{
$obj = (array)$json;
$SW_parameters = array();
foreach ($obj as $k => $v) {
if (empty($v))
unset($obj[$k]);
}
foreach ($obj as $k => $v) {
if (strpos($k,'_value') !== FALSE ) {
$sw= str_replace ('_value', '', $k);
$SW_val = array();
$SW_val['value'] = $obj[$sw.'_value'] * $this->factors[$sw];
if ($obj[$sw.'_weight'] != '') $SW_val['weight'] = $obj[$sw.'_weight'];
if ($obj[$sw.'_scale'] != '') $SW_val['scale'] = $obj[$sw.'_scale']* $this->factors[$sw];
$SW_parameters[$sw] = $SW_val;
}
}
$params = array (
'Object' => 'Earth', // Mandatory
'RunCount' => $obj['RunCount'], // Number of runs returned. Optional, default = 1
'SW_parameters' => $SW_parameters);
return $params;
}
protected function changeJson($object){
$i=0;
foreach ($object['runs'] as $run){
$run['S_diff'] = round($run['S_diff'],3);
foreach ($run['S_diff_n'] as $k => $v){
$v = round($v,3);
$run['S_diff_n'][$k] = $v;
}
foreach ($run['Param_values'] as $k => $v){
if ($this->factors[$k]){
$newValue = round($v / $this->factors[$k], 3);
$run['Param_values'][$k] = $newValue;
}
}
$object['runs'][$i] = $run;
$i++;
}
return $object;
}
protected function param2ddSimu($paramID) {
$pairs = array(" " => "_","-" => "_","/" => "_","%" => "_","\\" => "_","$" => "_",":" => "_","+" =>"_","#" => "_","@" => "_","." => "_", ">" => "_", "<" => "_", "," => "_");
return strtr($paramID,$pairs);
}
}
?>