add the option to dump the nonlocal field values for the ASlibs via the programm dump_nonlocal_field.
This commit is contained in:
parent
c6c7deec9c
commit
4a2d865282
2
src/external/Nonlocal/CMakeLists.txt
vendored
2
src/external/Nonlocal/CMakeLists.txt
vendored
@ -1,5 +1,7 @@
|
||||
# - Nonlocal library ----------------------------------------------------------
|
||||
|
||||
add_subdirectory(prog)
|
||||
|
||||
#--- generate necessary dictionaries ------------------------------------------
|
||||
set(MUSRFIT_INC ${CMAKE_SOURCE_DIR}/src/include)
|
||||
set(NONLOCAL_INC ${CMAKE_SOURCE_DIR}/src/external/Nonlocal)
|
||||
|
4
src/external/Nonlocal/cmake/dnlf_config.h.in
vendored
Normal file
4
src/external/Nonlocal/cmake/dnlf_config.h.in
vendored
Normal file
@ -0,0 +1,4 @@
|
||||
// dnlf_config.h
|
||||
|
||||
#define PROJECT_VERSION "@PROJECT_VERSION@"
|
||||
|
30
src/external/Nonlocal/prog/CMakeLists.txt
vendored
Normal file
30
src/external/Nonlocal/prog/CMakeLists.txt
vendored
Normal file
@ -0,0 +1,30 @@
|
||||
#--- dump_nonlocal_field ------------------------------------------------------
|
||||
|
||||
project(dump_nonlocal_field VERSION 1.0.0 LANGUAGES C CXX)
|
||||
|
||||
#--- feed dnlf_config.h -----------------------------------------
|
||||
set(HAVE_DNLF_CONFIG_H 1 CACHE INTERNAL "dnlf_config.h is available")
|
||||
configure_file(${CMAKE_CURRENT_SOURCE_DIR}/../cmake/dnlf_config.h.in ${CMAKE_CURRENT_BINARY_DIR}/dnlf_config.h)
|
||||
|
||||
add_executable(dump_nonlocal_field ${GIT_REV_H} dump_nonlocal_field.cpp)
|
||||
target_compile_options(dump_nonlocal_field BEFORE PRIVATE "-DHAVE_CONFIG_H" "-DHAVE_DNLF_CONFIG_H" "${HAVE_GIT_REV_H}")
|
||||
target_include_directories(dump_nonlocal_field
|
||||
BEFORE PRIVATE
|
||||
$<BUILD_INTERFACE:${Boost_INCLUDE_DIR}>
|
||||
$<BUILD_INTERFACE:${CMAKE_BINARY_DIR}>
|
||||
$<BUILD_INTERFACE:${CMAKE_BINARY_DIR}/src>
|
||||
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}>
|
||||
$<BUILD_INTERFACE:${CMAKE_CURRENT_BINARY_DIR}/..>
|
||||
)
|
||||
target_link_libraries(dump_nonlocal_field ${ROOT_LIBRARIES} ${MUSRFIT_LIBS} PNL_PippardFitter)
|
||||
|
||||
#--- installation info --------------------------------------------------------
|
||||
install(
|
||||
TARGETS
|
||||
dump_nonlocal_field
|
||||
RUNTIME DESTINATION
|
||||
bin
|
||||
)
|
||||
|
||||
|
||||
|
286
src/external/Nonlocal/prog/dump_nonlocal_field.cpp
vendored
Normal file
286
src/external/Nonlocal/prog/dump_nonlocal_field.cpp
vendored
Normal file
@ -0,0 +1,286 @@
|
||||
/***************************************************************************
|
||||
|
||||
dump_nonlocal_field.cpp
|
||||
|
||||
Author: Andreas Suter
|
||||
e-mail: andreas.suter@psi.ch
|
||||
|
||||
***************************************************************************/
|
||||
|
||||
/***************************************************************************
|
||||
* Copyright (C) 2009-2021 by Andreas Suter *
|
||||
* andreas.suter@psi.ch *
|
||||
* *
|
||||
* This program is free software; you can redistribute it and/or modify *
|
||||
* it under the terms of the GNU General Public License as published by *
|
||||
* the Free Software Foundation; either version 2 of the License, or *
|
||||
* (at your option) any later version. *
|
||||
* *
|
||||
* This program is distributed in the hope that it will be useful, *
|
||||
* but WITHOUT ANY WARRANTY; without even the implied warranty of *
|
||||
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the *
|
||||
* GNU General Public License for more details. *
|
||||
* *
|
||||
* You should have received a copy of the GNU General Public License *
|
||||
* along with this program; if not, write to the *
|
||||
* Free Software Foundation, Inc., *
|
||||
* 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA. *
|
||||
***************************************************************************/
|
||||
|
||||
#include <iostream>
|
||||
#include <fstream>
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <map>
|
||||
#include <cstring>
|
||||
|
||||
#include <boost/algorithm/string.hpp>
|
||||
|
||||
#include "PNL_PippardFitter.h"
|
||||
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#include "config.h"
|
||||
#endif
|
||||
#ifdef HAVE_DNLF_CONFIG_H
|
||||
#include "dnlf_config.h"
|
||||
#endif
|
||||
#ifdef HAVE_GIT_REV_H
|
||||
#include "git-revision.h"
|
||||
#endif
|
||||
|
||||
void dnlf_syntax()
|
||||
{
|
||||
std::cout << std::endl;
|
||||
std::cout << "usage: dump_nonlocal_field [<msr-file> --out <field-dump> [--step <stepVal>] | --version | --help]" << std::endl;
|
||||
std::cout << " <msr-file> : nonlocal msr-file name." << std::endl;
|
||||
std::cout << " --out <field-dump> : ascii field dump output file name." << std::endl;
|
||||
std::cout << " --step <stepVal> : this optional parameters allows to define the z-value step size in (nm)." << std::endl;
|
||||
std::cout << " --version : dumps the version" << std::endl;
|
||||
std::cout << " --help : will dump this help" << std::endl;
|
||||
std::cout << std::endl << std::endl;
|
||||
}
|
||||
|
||||
bool dnlf_read_msr(const std::string fln, std::vector<double> ¶m)
|
||||
{
|
||||
std::ifstream fin(fln.c_str(), std::ifstream::in);
|
||||
if (!fin.is_open()) {
|
||||
std::cerr << std::endl;
|
||||
std::cerr << "**ERROR** couldn't open msr-file: " << fln << std::endl;
|
||||
std::cerr << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
std::vector<std::string> msrData;
|
||||
std::string line;
|
||||
while (fin.good()) {
|
||||
std::getline(fin, line);
|
||||
msrData.push_back(line);
|
||||
}
|
||||
|
||||
fin.close();
|
||||
|
||||
// find userFcn line
|
||||
line = "";
|
||||
for (int i=0; i<msrData.size(); i++) {
|
||||
if (msrData[i].find("userFcn") != std::string::npos) {
|
||||
line = msrData[i];
|
||||
if (line.find("PNL_PippardFitter") != std::string::npos)
|
||||
break;
|
||||
line = "";
|
||||
}
|
||||
}
|
||||
|
||||
if (line.empty()) {
|
||||
std::cerr << std::endl;
|
||||
std::cerr << "**ERROR** msr-file: " << fln << " seems not a proper nonlocal fit file." << std::endl;
|
||||
std::cerr << std::endl;
|
||||
return false;
|
||||
}
|
||||
|
||||
// tokenize parameter part.
|
||||
size_t pos=0;
|
||||
pos = line.find(" PNL_PippardFitter");
|
||||
line = line.substr(pos+18); // remove the 'userFcn libPNL_PippardFitter PNL_PippardFitter' part
|
||||
boost::algorithm::trim(line); // remove leading/trailing whitespaces
|
||||
std::vector<std::string> tok;
|
||||
boost::split(tok, line, boost::is_any_of(" \t"), boost::token_compress_on);
|
||||
std::vector<int> paramIdx;
|
||||
int ival;
|
||||
for (int i=0; i<tok.size(); i++) {
|
||||
try {
|
||||
ival = std::stoi(tok[i]);
|
||||
}
|
||||
catch(std::exception& e) {
|
||||
ival = 0;
|
||||
}
|
||||
paramIdx.push_back(ival);
|
||||
}
|
||||
|
||||
// find parameter value which corresponds to param index
|
||||
bool inFitParamBlock(false);
|
||||
std::map<int, double> paramMap;
|
||||
double dval;
|
||||
for (int i=0; i<msrData.size(); i++) {
|
||||
if (inFitParamBlock) {
|
||||
if (msrData[i].empty()) {
|
||||
continue;
|
||||
} else if (msrData[i][0] == '#') {
|
||||
continue;
|
||||
} else if (msrData[i].find("THEORY") != std::string::npos) {
|
||||
inFitParamBlock = false;
|
||||
break;
|
||||
} else {
|
||||
tok.clear();
|
||||
line = msrData[i];
|
||||
boost::algorithm::trim(line); // remove leading/trailing whitespaces
|
||||
boost::split(tok, line, boost::is_any_of(" \t"), boost::token_compress_on);
|
||||
if (tok.size() < 3) {
|
||||
std::cerr << "**ERROR** bug in the fit parameter block!" << std::endl;
|
||||
std::cerr << "'" << msrData[i] << "'" << std::endl;
|
||||
return false;
|
||||
}
|
||||
// param index
|
||||
try {
|
||||
ival = std::stoi(tok[0]);
|
||||
}
|
||||
catch(std::exception& e) {
|
||||
ival = 0;
|
||||
}
|
||||
// param value
|
||||
try {
|
||||
dval = std::stod(tok[2]);
|
||||
}
|
||||
catch(std::exception& e) {
|
||||
dval = 0.0;
|
||||
}
|
||||
paramMap[ival] = dval;
|
||||
}
|
||||
} else {
|
||||
if (msrData[i].find("FITPARAMETER") != std::string::npos) {
|
||||
inFitParamBlock = true;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
for (int i=0; i<paramIdx.size(); i++) {
|
||||
if (paramIdx[i] != 0)
|
||||
dval = paramMap.find(paramIdx[i])->second;
|
||||
else
|
||||
dval = 0.0;
|
||||
param.push_back(dval);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
int main(int argc, char* argv[])
|
||||
{
|
||||
std::string msrFileName("");
|
||||
std::string outFileName("");
|
||||
double step(0.0);
|
||||
bool show_syntax(false);
|
||||
|
||||
if (argc == 1) {
|
||||
dnlf_syntax();
|
||||
return 0;
|
||||
}
|
||||
|
||||
for (int i=0; i<argc; i++) {
|
||||
if (argv[i][0] != '-') { // must be the msr-file name
|
||||
msrFileName = argv[i];
|
||||
} else if (!strcmp(argv[i], "--version")) {
|
||||
#ifdef HAVE_CONFIG_H
|
||||
#ifdef HAVE_GIT_REV_H
|
||||
std::cout << std::endl << "dump_nonlocal_field version: " << PROJECT_VERSION << " (" << PACKAGE_VERSION << "), git-branch: " << GIT_BRANCH << ", git-rev: " << GIT_CURRENT_SHA1 << " (" << BUILD_TYPE << "), ROOT version: " << ROOT_VERSION_USED << std::endl << std::endl;
|
||||
#else
|
||||
std::cout << std::endl << "dump_nonlocal_field version: " << PROJECT_VERSION << " (" << PACKAGE_VERSION << "/" << BUILD_TYPE << "), ROOT version: " << ROOT_VERSION_USED << std::endl << std::endl;
|
||||
#endif
|
||||
#else
|
||||
#ifdef HAVE_GIT_REV_H
|
||||
std::cout << std::endl << "dump_nonlocal_field git-branch: " << GIT_BRANCH << ", git-rev: " << GIT_CURRENT_SHA1 << std::endl << std::endl;
|
||||
#else
|
||||
std::cout << std::endl << "dump_nonlocal_field version: unknown" << std::endl << std::endl;
|
||||
#endif
|
||||
#endif
|
||||
return 0;
|
||||
} else if (!strcmp(argv[i], "--help")) {
|
||||
dnlf_syntax();
|
||||
return 0;
|
||||
} else if (!strcmp(argv[i], "--out")) {
|
||||
if (i < argc-1) {
|
||||
outFileName = argv[i+1];
|
||||
i++;
|
||||
} else {
|
||||
std::cerr << std::endl << "dump_nonlocal_field: **ERROR** found option --out without <field-dump>" << std::endl;
|
||||
show_syntax = true;
|
||||
break;
|
||||
}
|
||||
} else if (!strcmp(argv[i], "--step")) {
|
||||
if (i < argc-1) {
|
||||
try {
|
||||
step = std::stod(argv[i+1]);
|
||||
}
|
||||
catch(std::exception& e) {
|
||||
std::cout << "dump_nonlocal_field: **ERROR** <stepVal> '" << argv[i+1] << "' seems not to be a double." << std::endl;
|
||||
show_syntax = true;
|
||||
break;
|
||||
}
|
||||
i++;
|
||||
} else {
|
||||
std::cerr << std::endl << "dump_nonlocal_field: **ERROR** found option --step without <stepVal>" << std::endl;
|
||||
show_syntax = true;
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
if (show_syntax) {
|
||||
dnlf_syntax();
|
||||
return -1;
|
||||
}
|
||||
|
||||
std::vector<double> param;
|
||||
if (!dnlf_read_msr(msrFileName, param)) {
|
||||
return -2;
|
||||
}
|
||||
|
||||
|
||||
// calculate field and write it to file
|
||||
PNL_PippardFitterGlobal pip;
|
||||
pip.CalculateField(param);
|
||||
|
||||
std::ofstream fout(outFileName.c_str(), std::ofstream::out);
|
||||
if (!fout.is_open()) {
|
||||
std::cout << std::endl;
|
||||
std::cerr << "**ERROR** can not write to file '" << outFileName << "'." << std::endl;
|
||||
std::cout << std::endl;
|
||||
return -3;
|
||||
}
|
||||
// write header
|
||||
fout << "% z (nm), field (G)" << std::endl;
|
||||
|
||||
// write data
|
||||
double z=0.0;
|
||||
if (step == 0.0)
|
||||
step = 0.1;
|
||||
double prevField=0.0, field=0.0;
|
||||
bool done(false);
|
||||
double deadLayer = param[8];
|
||||
double b0 = param[6];
|
||||
do {
|
||||
if (z < deadLayer) {
|
||||
fout << z << ", " << b0 << std::endl;
|
||||
} else {
|
||||
field = pip.GetMagneticField(z-deadLayer);
|
||||
fout << z << ", " << b0*field << std::endl;
|
||||
if (fabs(prevField-field) < 1.0e-10)
|
||||
done = true;
|
||||
prevField = field;
|
||||
}
|
||||
z += step;
|
||||
} while (!done);
|
||||
|
||||
fout.close();
|
||||
|
||||
return 0;
|
||||
}
|
Loading…
x
Reference in New Issue
Block a user