Doing combined analysis on separate simulations

Hi Sim4life community,

Is it somehow possible to do analysis on two separate simulations in sim4life without exporting the data to for example Matlab?
For example if I have almost the same simulation twice but with some parameter changed and I want to compare the SAR of each simulation by subtracting or normalizing the SAR simulations.

Best,
Frodi Gregersen

Dear Frodi,

You can drag&drop the results files (output.h5 file under results folder) into Analysis tab and then extract & post-process the results.

Best,

Hi Ofli,

Thank you for the answer but I don't think it solves my problem. Maybe I wasn't clear enough. I'm talking about doing post processing on the SAR data from two different simulations (not combining one multiport simulation). Is it for example possible to subtract the SAR data from two different simulations and display the resulting SAR (or SAR difference)?

Thanks,
Frodi

Hey,
I don't think there is a direct method to do so within Sim4Life, however, you could always use the method by ofli and then use the python extension in Sim4Life to subtract two results. Make sure that both simulations are on the same grid before subtracting (otherwise you need to interpolate one of the fields to the same dimensions). If you are unsure on how to do this let me know and I can see if I can whip up some code :)

Cheers,
peter

Hi Peter,

Thank you for the answer. I have no experience using the python extension in Sim4Life, so it would be highly appreciated if you would be willing to make a simple example for this. Just the most basic situation you can make and then I can take it from there.

Best,
Frodi

Hey Frodi,

So I made a "small" script for you. It is by no means perfect but it gets the job done (I modified some script I had available). This does assume you have both simulations in the same Sim4Life project, however, I think this should still work if you would import the results from another project. Only selecting the simulation gets a bit trickier probably.
Hopefully, this helps!

Cheers,
Peter

# done with Sim4Life V3.4
# import the functions you will need
import s4l_v1 as s4l
import s4l_v1.simulation as simulation
import s4l_v1.document as doc
# I think using pyplot is a little easier for this instance, you could use the sim4life viewers too I think.
import matplotlib.pyplot as plt
import numpy as np

# function to reshape the sar fields to the correct dimensions
def reshapeSim4LifeField(tempField,simulationInstance,flagAxes):
	gridsize = np.array(simulationInstance.Data.Grid.Dimensions) - 1
	tempField = tempField.reshape(gridsize, order = 'F') #only 1 component (magnitude of SAR)		
	
	# Export the axes in case you need to reshape (only needed if you have different grids) 
	if flagAxes:
		Axis0 = simulationInstance.Data.Grid.XAxis
		Axis1 = simulationInstance.Data.Grid.YAxis
		Axis2 = simulationInstance.Data.Grid.ZAxis
	else:
		Axis0 = 0
		Axis1 = 0
		Axis2 = 0
	return tempField,Axis0,Axis1,Axis2

# set some options 
# normalize the field to input power
flagNormalize = True 
# reshape the fields
flagReshape   = True
# export the axes if you want to interpolate
flagAxes 	  = False

# make a list of all the simulations in your file
sims = list(s4l.document.AllSimulations)
# select the 2 you want from the list (0,1 chosen here)
sim1 = sims[0]
sim2 = sims[1]

# get all the object with all the available fields for the first simulation
sim1Results 	      = sim1.Results()
availableFields1	  = sim1Results["Overall Field"]
availableFields1.FrequencySettings.ExtractedFrequency = u"All"
# and for the second
sim2Results 	  	  = sim2.Results()
availableFields2	  = sim2Results["Overall Field"]
availableFields2.FrequencySettings.ExtractedFrequency = u"All"

# normalize to input power if you want to 
if flagNormalize:
		availableFields1.Normalization.Normalize = True
		availableFields2.Normalization.Normalize = True
		# you can also choose another normalization reference
		availableFields1.Normalization.AvailableReferences = "EM Input Power(f)"
		availableFields2.Normalization.AvailableReferences = "EM Input Power(f)"
		# set the value (this is 1W input power now)
		availableFields1.Normalization.NewReferenceValue   = 1
		availableFields2.Normalization.NewReferenceValue   = 1

# select the field you want (SAR in your case)
sim1SAR = availableFields1["SAR(x,y,z,f0)"]
sim2SAR = availableFields2["SAR(x,y,z,f0)"]

# actually extract the field (most of the memory is allocated here)
sim1SAR.Update()
sim2SAR.Update()

# select the frequency index (chosen the first, if you did your simulation at more frequencies you can change the 0 to some other index)
sim1SARAtFreq = np.array(sim1SAR.Data.Field(0))
sim2SARAtFreq = np.array(sim2SAR.Data.Field(0))

# reshape the fields
if flagReshape:
	sim1SARAtFreq,Sim1Axis0,Sim1Axis1,Sim1Axis2 = reshapeSim4LifeField(sim1SARAtFreq,sim1SAR,flagAxes)
	sim2SARAtFreq,Sim2Axis0,Sim2Axis1,Sim2Axis2 = reshapeSim4LifeField(sim2SARAtFreq,sim2SAR,flagAxes)

# take the difference
diffSAR = sim1SARAtFreq - sim2SARAtFreq

# plot an arbitrary slice
plt.pcolormesh(diffSAR[:,:,1])
plt.show()

Thank you so much Peter. I appreciate it a lot. I'll try it out later.

Hi, sorry to jump in, but in general it is possible to compare simulation results within Sim4Life without going into Python (though python is really handy for this stuff). In the analysis tab, you need to select the two Sensors of interest (select while holding the control key) and different options will pop up in the ribbon - It seems what you want is a field combiner, where you can add fields (weight the first with 1.0 and the second with -1.0 to subtract them). You can do the same for 2d plots, where you can plot lines together by selecting multiple plots in postpro and then clicking on Combine Plots in the ribbon.

It's a neat tool I use a lot but is a bit hidden in sim4life since you only get access to it once you select two elements in the analysis tab.

Note that the Field Combiner only works for fields that are represented on the same grid. If the fields you want to compare are from simulations done with different grids, you will have to first interpolate one field onto the grid of the other (select both fields and use the Interpolator algorithm).

@montanaro ,
Ohh that is maybe a better solution to the current problem, awesome:)

Log in to reply