Program run error

Hello, I was modifying the program when the error below occurred.I tried to modify it in other ways, but it didn’t work. Thank you!

I added a line of code

DriftElectron(x0, y0, z0, t0)

in this zone.

  constexpr unsigned int nEvents = 50000;//离子数与电子数
  for (unsigned int i = 0; i <= nEvents; ++i) { 
    std::cout << i << "/" << nEvents << "\n";
    // Randomize the initial position. 距离单位cm
    const double x0 = 3.0* RndmUniform()-1.5;//-15-15mm
    const double y0 = 0.025+0.4*RndmUniform();//
    const double z0 = -0.6+1.2*RndmUniform(); //-5-5mm
    const double t0 = 0 ;
    drift.DriftIon(x0, y0, z0, t0); 
    drift.DriftElectron(x0, y0, z0, t0);
  }

and I got this error.

*** Break *** segmentation violation
Generating stack trace…
0x00007f8d8d9d4083 in __libc_start_main + 0xf3 from /lib/x86_64-linux-gnu/libc.so.6
0x00007f8d90f4caee in from ./sw

Here is my program.



#include <iostream>
#include <fstream>
#include <cstdlib>

#include <omp.h>
#include <TCanvas.h>
#include <TROOT.h>
#include <TApplication.h>
#include <TH1F.h>

#include "Garfield/ViewDrift.hh"
#include "Garfield/ViewSignal.hh"
#include "Garfield/ViewField.hh"
#include "Garfield/ViewFEMesh.hh"
#include "Garfield/ViewMedium.hh"

#include "Garfield/DriftLineRKF.hh"
#include "Garfield/ComponentComsol.hh"
#include "Garfield/MediumMagboltz.hh"
#include "Garfield/Sensor.hh"
#include "Garfield/AvalancheMC.hh"
#include "Garfield/AvalancheMicroscopic.hh"
#include "Garfield/SolidBox.hh"
#include "Garfield/GeometrySimple.hh"
#include "Garfield/ComponentConstant.hh"
#include "Garfield/TrackSrim.hh"
#include "Garfield/Random.hh"
#include "Garfield/Plotting.hh"
#include "Garfield/TrackHeed.hh"

using namespace Garfield;

//原始charge信号打印到txt文件函数
void printcharge(Sensor& sensor,const std::string label,const int nTimebins,const double tstep,const double tmin,const double index){     
  char title[60];
  sprintf(title, "charge_%s.txt",label.c_str()); 
  std::ofstream outfile;
  outfile.open(title,std::ios::out);
  outfile << "time(ns)     "<< "total charge     "<< "electron charge   " << "ion charge\n";
  for(unsigned int i=0;i<nTimebins;++i){
    const double t=tstep/2+tmin+i*tstep;
    const double f=sensor.GetSignal(label,i);
    const double fe=sensor.GetElectronSignal(label,i);
    const double fion=sensor.GetIonSignal(label,i);
    outfile << t << "      "  << f << "      "  <<fe << "      "   << fion << "\n";
  }
}

//原始电流信号打印到txt文件函数
void printsignaltotxt(Sensor& sensor,const std::string label,const int nTimebins,const double tstep,const double tmin){     
  char title[60];
  sprintf(title,"current_%s.txt",label.c_str()); 
  std::ofstream outfile;
  outfile.open(title,std::ios::out);
  outfile << "time(ns)     "<< "total current     "<< "electron current     " << "ion current\n";
  for(unsigned int i=0;i<nTimebins;++i){
    const double t=tstep/2+tmin+i*tstep;
    const double f=sensor.GetSignal(label,i);
    const double fe=sensor.GetElectronSignal(label,i);
    const double fion=sensor.GetIonSignal(label,i);
    outfile << t << "      "  << f << "      "  <<fe << "      "   << fion << "\n";
  }
}


int main(int argc, char * argv[]) {

  TApplication app("app", &argc, argv);

  //导入电场文件COSMOL、材料关联
  ComponentComsol fm;
  fm.Initialise("mesh1.mphtxt", "dielectrics.dat", "field1.txt", "mm");
  fm.SetWeightingPotential("weight_sj.txt", "sj");
  fm.SetWeightingPotential("weight_sw.txt", "sw");
  fm.PrintRange();

  // Setup the gas.
  MediumMagboltz gas;
  gas.SetComposition("xe", 100.); //100%Xe
  gas.SetTemperature(293.15);
  gas.SetPressure(40*760.);
  gas.LoadGasFile("xe_40atm.gas"); 
  // Load the ion mobilities.
  const std::string path = std::getenv("GARFIELD_HOME");
  gas.LoadIonMobility(path + "/Data/IonMobility_Xe+_P12_Xe.txt");//Xe离子种类需要改进,看论文
  // Associate the gas with the corresponding field map material. 
  const unsigned int nMaterials = fm.GetNumberOfMaterials();
  for (unsigned int i = 0; i < nMaterials; ++i) {
    const double eps = fm.GetPermittivity(i);
    if (eps == 1.) fm.SetMedium(i, &gas);//金属的介电常数需要查询,不能为1 ,可以设置为1e10
  }
  fm.PrintMaterials();

  // Create the sensor.
  Sensor sensor;
  sensor.AddComponent(&fm);
  sensor.AddElectrode(&fm,"sj");     
  sensor.AddElectrode(&fm,"sw"); 
  sensor.SetArea(-4.0, 0, -0.8, 4.0, 0.6, 0.8);

  //设置信号计算的时间下时间限,步长及时间步长个数,单位ns
  const double tstep = 100;      //**********  //信号采样步长,0.1微秒 (ns,s=1e9ns)
  const double tmin = 0;     //********** //信号采样时间下限
  const double tmax=20000000;         //*****上限,根据结果调整  1ms   
  const unsigned int nbins = (tmax-tmin)/tstep;   //信号采样时间间隔数 ,随机取样
  sensor.SetTimeWindow(tmin, tstep, nbins);
  sensor.ClearSignal();

  DriftLineRKF drift;//用以计算初电离离子漂移
  drift.SetSensor(&sensor);     //链接Sensor
  drift.UseWeightingPotential(true);    
  drift.EnableSignalCalculation();    //开启电流信号计算

  ViewDrift driftView;
  constexpr bool plotDrift = true;
  if (plotDrift) {
    drift.EnablePlotting(&driftView);//离子漂移线
  }
  
  constexpr unsigned int nEvents = 50000;//离子数与电子数
  for (unsigned int i = 0; i <= nEvents; ++i) { 
    std::cout << i << "/" << nEvents << "\n";
    // Randomize the initial position. 距离单位cm
    const double x0 = 3.0* RndmUniform()-1.5;//-15-15mm
    const double y0 = 0.025+0.4*RndmUniform();//
    const double z0 = -0.6+1.2*RndmUniform(); //-5-5mm
    const double t0 = 0 ;
    drift.DriftIon(x0, y0, z0, t0); 
    drift.DriftElectron(x0, y0, z0, t0);
  }

  //driftline_plot
  if (plotDrift) {
    TCanvas* cd = new TCanvas("cd","drift line",600,600);
    ViewFEMesh* meshView = new ViewFEMesh();
    meshView->SetArea(-4.0, -0.2, -1.0, 4.0, 0.6, 1.0);
    meshView->SetCanvas(cd);
    meshView->SetComponent(&fm);
    // y-z projection.
    meshView->SetPlane(1, 0, 0, 0, 0, 0);
    meshView->SetFillMesh(true);
    // Set the color of the 304.map ID,不锈钢上色
    driftView.SetColourElectrons(kRed);
    driftView.SetColourTracks(kGreen + 3); 
    driftView.SetColourIons(kYellow);
    //
    meshView->SetColor(1, kRed);
    meshView->EnableAxes();
    meshView->SetViewDrift(&driftView);
    meshView->Plot();
    cd->SaveAs("dirftline.jpg");//输出漂移线图片
  }   

  // ----  收集极输出信号   ----

  // Plot the induced current.
  ViewSignal signalView;
  signalView.SetSensor(&sensor);
  TCanvas* c1 = new TCanvas("signal_sj_current", "", 800, 600);
  signalView.SetCanvas(c1);
  signalView.SetLabelY("Induced Current-sj [fc/ns]");
  signalView.PlotSignal("sj");
  //打印原始总电流,电子电流,离子电流信号到txt文件
  printsignaltotxt(sensor,"sj",nbins,tstep,tmin);   
  
  // 阳极上电荷计算
  TCanvas c2("signal_sj_charge", "", 600, 600);
  sensor.IntegrateSignal("sj");
  signalView.SetCanvas(&c2);
  signalView.SetLabelY("Induced Charge-sj [fC]");
  signalView.PlotSignal("sj");
  // 电荷信号文件保存
  printcharge(sensor,"sj",nbins,tstep,tmin,0);  

  // ----- 栅极输出信号 -----

  // Plot the induced current.
  ViewSignal signalView_sw;
  signalView_sw.SetSensor(&sensor);
  TCanvas* c3 = new TCanvas("signal_sw_current", "", 600, 600);
  signalView_sw.SetCanvas(c3);
  signalView_sw.SetLabelY("Induced Current-sw [fc/ns]");
  signalView_sw.PlotSignal("sw");
  //打印原始总电流,电子电流,离子电流信号到txt文件
  printsignaltotxt(sensor,"sw",nbins,tstep,tmin);   
  // 阳极上电荷计算
  TCanvas c4("signal_sj_charge", "", 800, 600);
  sensor.IntegrateSignal("sw");
  signalView_sw.SetCanvas(&c4);
  signalView_sw.SetLabelY("Induced Charge-sw [fC]");
  signalView_sw.PlotSignal("sw");
  // 电荷信号文件保存
  printcharge(sensor,"sw",nbins,tstep,tmin,0);  

  //计算完成标志
  std::cout << "=======================" <<std::endl;
  std::cout << "Calculation is finished.\n";    
  app.Run(true);

}

Hi, hschindl @hschindl

The line that you added looks quite innocent.
Does this always happen or only for specific starting points (x0, y0, z0)?

It always happens. It feels strange.

Indeed, that’s strange. Can you try it on a fresh installation of Garfield++? If you still have the same issue, can you provide a minimal version of the program that reproduces the segmentation violation, together with the input files needed to run it?

I updated Garfield++ and the problem was solved. Thank you very much. :grinning:

This topic was automatically closed 14 days after the last reply. New replies are no longer allowed.