content: package edu.stanford.rsl.conrad.volume3d.operations;
  
  public class DivideSlabs extends ParallelVolumeOperation {
  
  	@Override
  	public void performOperation() {
  		boolean div_z_mess = false;
  		switch (vol1.getInternalDimension()) {
  
  		case 1:
  
  			for (int indexX=beginIndexX; indexX<endIndexX; indexX++) {
  				for (int indexY=0; indexY<vol1.size[1]; indexY++) {
  					for (int indexZ=0; indexZ<vol1.size[2]; indexZ++) {	
  						if (vol2.data[indexX][indexY][indexZ]==0 && div_z_mess==false) {
  							System.out.println( "DivideSlabs: Division by zero in one volume element.");							
  							div_z_mess=true;
  						} 
  						vol1.data[indexX][indexY][indexZ] = vol1.data[indexX][indexY][indexZ] / vol2.data[indexX][indexY][indexZ];
  					}
  				}
  			}
  
  			break;
  
  		case 2:   
  
  			for (int indexX=beginIndexX; indexX<endIndexX; indexX++) {
  				for (int indexY=0; indexY<vol1.size[1]; indexY++) {
  					for (int indexZ=0; indexZ<vol1.size[2]; indexZ++) {	
  
  						float tmp_abs_sq =
  							vol2.data[indexX][indexY][indexZ*2]   * vol2.data[indexX][indexY][indexZ*2]+
  							vol2.data[indexX][indexY][indexZ*2+1] * vol2.data[indexX][indexY][indexZ*2+1];
  
  						if (tmp_abs_sq==0 && div_z_mess==false) {
  							System.out.println("vol_div: Division by zero\n");
  							div_z_mess=true;
  						}
  
  						float tmp_re1 = vol1.data[indexX][indexY][indexZ*2];
  						float tmp_re2 = vol2.data[indexX][indexY][indexZ*2];
  
  						vol1.data[indexX][indexY][indexZ*2]   = 
  							(vol1.data[indexX][indexY][indexZ*2]   * vol2.data[indexX][indexY][indexZ*2] +
  									vol1.data[indexX][indexY][indexZ*2+1] * vol2.data[indexX][indexY][indexZ*2+1]) / tmp_abs_sq;
  
  						vol1.data[indexX][indexY][indexZ*2+1] = 
  							(vol1.data[indexX][indexY][indexZ*2+1] * tmp_re2 -
  									vol2.data[indexX][indexY][indexZ*2+1] * tmp_re1) / tmp_abs_sq;
  
  					}
  				}
  			}
  
  			break;
  
  		default:
  			System.out.println("vol_div: Invalid dimension\n");
  		}
  
  	}
  
  	@Override
  	public ParallelVolumeOperation clone() {
  		return new DivideSlabs();
  	}
  
  }
  /*
   * Copyright (C) 2010-2014  Andreas Maier
   * CONRAD is developed as an Open Source project under the GNU General Public License (GPL).
  */