1e6,
"SW_Utot"=>1e3,
// "SW_Temperature"=>1e3,
"SW_Temperature"=>1.16e4, // ev => K
"SW_Btot"=>1e-9,
"SW_Bx"=>1e-9,
"SW_By"=>1e-9,
"SW_Bz"=>1e-9
);
function __construct() {}
public function init()
{
// DOM of SIMU RUNs template
$this->domTemplate = new DomDocument("1.0");
if (!$this->domTemplate->load(DATAPATH.'SimuTemplate/templateGUMICS.xml'))
return false;
$this->xpTemplate = new domxpath($this->domTemplate);
$this->runTemplate = $this->xpTemplate->query("//runID")->item(0);
// DOM of user RemoteParams
$this->domRemoteData = new DomDocument("1.0");
if (!$this->domRemoteData->load(USERWSDIR.'RemoteParams.xml'))
return false;
$this->xpRemoteData = new domxpath($this->domRemoteData);
$this->json = file_get_contents(USERWSDIR.'runs.json');
return true;
}
// $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("http://impex-fp7.fmi.fi/ws/Methods_FMI.wsdl",
array(
'wsdl_cache' => 0,
'trace' => 1,
'exceptions' => 0,
'soap_version'=>SOAP_1_2
));
}
catch (SoapFault $exception)
{
$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');
$numericalOutputs = $run['NumericalOutput']; // array !
foreach ($datasets as $dataset)
{
$name = $dataset->getAttribute('name');
$find = false;
foreach ($numericalOutputs as $no)
{
if (strpos($no, $name) > 0)
{
$datasetId = $no;
$find = true;
break;
}
}
if (!$find)
throw new Exception($name." is not found in FMI_GUMICS response");
// $datasetId = str_replace('SimulationRun','NumericalOutput',$run['ResourceID'].'/'.$name);
$dataset->setAttribute('xml:id', $datasetId);
$dataset->setAttribute('desc');
$dataset->setAttribute('globalStart', 'depending on mission');
$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'],1);
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);
}
}
?>