一个脚本两步计算材料Raman谱(附数据处理和绘图脚本)

news2024/9/23 11:27:04

        在以往推送中已经介绍了相当多的计算材料Raman的方法,使用的软件主要为Phonopy-Spectroscopy,相关软件还有vasp,phonopy,phono3py等。

Phonopy-Spectroscopy计算材料红外和Raman光谱

Phonopy-Spectroscopy 计算红外和拉曼光谱

    也有一些教程介绍了无需额外软件即可得到材料Raman信息的脚本vasp_raman.py,但脚本缺少自由度并且需要额外的数据处理。

    本篇推送即介绍这一脚本计算材料Raman信息的流程。

    脚本和案例可在作者处下载:

https://github.com/ZeliangSu/VaspRoutine/blob/main/raman-sc/

在本文最后也会附上0.6.0版本的脚本

准备工作

计算可得到无虚频的声子谱的结构文件

这里使用单晶硅作案例

   Si1.0     5.4661639157319968    0.0000000000000000    0.0000000000000000     0.0000000000000000    5.4661639157319968    0.0000000000000000     0.0000000000000000    0.0000000000000000    5.4661639157319968     Si   8Direct  0.8750000000000000  0.8750000000000000  0.8750000000000000  0.8750000000000000  0.3750000000000000  0.3750000000000000  0.3750000000000000  0.8750000000000000  0.3750000000000000  0.3750000000000000  0.3750000000000000  0.8750000000000000  0.1250000000000000  0.1250000000000000  0.1250000000000000  0.1250000000000000  0.6250000000000000  0.6250000000000000  0.6250000000000000  0.1250000000000000  0.6250000000000000  0.6250000000000000  0.6250000000000000  0.1250000000000000

图片

这里已将声子谱反折叠为原胞第一布里渊区内的声子色散,并将纵坐标单位设置为(cm-1)

计算第一步:频率信息

计算INCAR参考:

SYSTEM = Si_bulkISTART = 0 # From-scratch; job : 0-new 1-cont 2-samecut NWRITE = 3 Verbosity
! electronic relaxationENCUT = 300.0 # cut-off energyPREC = Accurate # precision : accurate/normal/low ISPIN = 1 # 1 - off, 2 - on (non spin-polarized calculation)ICHARG = 2 # > 10 for non-SC calculationIALGO = 38 # DAVidson, then RMM-DIISEDIFF = 1.0E-8 # defaultISMEAR = 0 # gaussianSIGMA = 0.05
! PAW'sLREAL = .FALSE. # default - Automatic choice of how projection is doneADDGRID = .TRUE.
! phononsIBRION = 5POTIM = 0.01
! parallelisationLPLANE = .FALSE.KPAR=8
! outputLWAVE = .FALSE. # WAVECAR fileLCHARG = .FALSE. # CHCAR fileLELF = .FALSE.LVTOT = .FALSE.

    特别注意参数:NWRITE = 3 Verbosity

计算完成后可自行处理声子色散和相关数据。材料的频率信息在OUTCAR中可自行查看。

计算第二步:宏观介电张量

    将第一步计算结果中的POSCAR复制为POSCAR.phon,将OUTCAR复制为OUTCAR.phon。

第二步INCAR参考:

SYSTEM = Si_bulkISTART = 0 # From-scratch; job : 0-new 1-cont 2-samecut NWRITE = 3 Verbosity
! electronic relaxationENCUT = 300.0 # cut-off energyPREC = Accurate # precision : accurate/normal/low ISPIN = 1 # 1 - off, 2 - on (non spin-polarized calculation)ICHARG = 2 # > 10 for non-SC calculationIALGO = 38 # DAVidson, then RMM-DIISEDIFF = 1.0E-8 # defaultISMEAR = 0 # gaussianSIGMA = 0.05
! PAW'sLREAL = .FALSE. # default - Automatic choice of how projection is doneADDGRID = .TRUE.
! phonons!! IBRION = 5!! POTIM = 0.01
LEPSILON=.TRUE.
! parallelisationLPLANE = .FALSE.KPAR=8
! outputLWAVE = .FALSE. # WAVECAR fileLCHARG = .FALSE. # CHCAR fileLELF = .FALSE.LVTOT = .FALSE.

此时需要调用脚本vasp_raman.py 进行第二步计算命令为:

export VASP_RAMAN_RUN='aprun -B /u/afonari/vasp.5.3.2/vasp.5.3/vasp &> job.out'export VASP_RAMAN_PARAMS='01_21_2_0.01'
python vasp_raman.py > vasp_raman.out

    第一行中 VASP_RAMAN_RUN为服务器等计算资源可使用的vasp的执行命令

注意:在集群使用队列资源排队进行计算的时候需要将上面三行命令都填写进队列系统脚本中,并替代原有的执行命令,具体请根据实际计算情况更改

     第二行中VASP_RAMAN_PARAMS参数为Raman计算针对的频率范围和计算设置。

第一个数为起始频率编号,01为起始频率编号;

第二个数为截至频率编号,最大值为POSCAR总原子数×3。

计算总任务数为第二个数减去第一个数再乘第三个数。

计算过程中脚本会读取OUTCAR.phon中的频率信息针对不同频率的声子所对应的原子振动模式对结构施加微扰。

同时会实时将新生成的OUTCAR另存最后统一数据处理。

图片

计算结果保存在vasp_raman.dat

# mode    freq(cm-1)    alpha    beta2    activity001   517.72301  -0.0219904  520.9354925  3646.5702084002   517.71996   0.0177803  521.9308522  3653.5301918003   517.71816  -0.0130798  521.3205054  3649.2512364004   446.13270  -0.0022072   0.0007120   0.0052035005   446.12649  -0.0026568   0.0001072   0.0010683006   446.11229  -0.0091150   0.0020607   0.0181638007   446.10094   0.0056815   0.0001899   0.0027820008   446.09466   0.0108317   0.0016816   0.0170508009   446.08791   0.0082157   0.0009541   0.0097161010   397.45270  -0.0004496   0.0001839   0.0012966011   397.45083  -0.0050684   0.0004061   0.0039986012   397.44702   0.0011036   0.0020508   0.0144103013   397.44649  -0.0029021   0.0011642   0.0085283014   397.44295  -0.0007766   0.0000371   0.0002871015   397.44138   0.0047005   0.0005162   0.0046073016   130.93534  -0.0010219   0.0000026   0.0000654017   130.92851   0.0026977   0.0000319   0.0005511018   130.92701  -0.0001635   0.0000030   0.0000221019   130.92623  -0.0006949   0.0000040   0.0000499020   130.92383  -0.0003270   0.0000030   0.0000261021   130.92351   0.0000817   0.0000035   0.0000247

    可见Raman活性频率为517cm-1,与Si实验值520cm-1相当接近 (J.H. Parker, et al., Phys Rev, 155, 712 (1967))。

    如果吹毛求疵,可以在计算频率或声子时便通过高精度结构优化和使用实验值的晶格常数等方法将所得对应的频率和实验值矫正。

    使用脚本将已经得到Raman信息处理(可自行选择拟合方式Gaussian或Lorentzian)

 python broaden.py vasp_raman.dat

图片

附:

vasp_raman.py脚本

https://github.com/ZeliangSu/VaspRoutine/blob/main/raman-sc/vasp_raman.py

#!/usr/bin/env python## vasp_raman.py v. 0.6.0## Raman off-resonant activity calculator# using VASP as a back-end.## Contributors: Alexandr Fonari (Georgia Tech)# Shannon Stauffer (UT Austin)## URL: http://raman-sc.github.io## MIT license, 2013 - 2016#

import reimport sys

def MAT_m_VEC(m, v):    p = [ 0.0 for i in range(len(v)) ]    for i in range(len(m)):        assert len(v) == len(m[i]), 'Length of the matrix row is not equal to the length of the vector'        p[i] = sum( [ m[i][j]*v[j] for j in range(len(v)) ] )    return p

def T(m):    p = [[ m[i][j] for i in range(len( m[j] )) ] for j in range(len( m )) ]    return p

def parse_poscar(poscar_fh):    # modified subroutine from phonopy 1.8.3 (New BSD license)    #    poscar_fh.seek(0) # just in case    lines = poscar_fh.readlines()    #    print(lines)    scale = float(lines[1])    if scale < 0.0:        print("[parse_poscar]: ERROR negative scale not implemented.")        sys.exit(1)    #    b = []    for i in range(2, 5):        b.append([float(x)*scale for x in lines[i].split()[:3]])    #    vol = b[0][0]*b[1][1]*b[2][2] + b[1][0]*b[2][1]*b[0][2] + b[2][0]*b[0][1]*b[1][2] - \          b[0][2]*b[1][1]*b[2][0] - b[2][1]*b[1][2]*b[0][0] - b[2][2]*b[0][1]*b[1][0]    #    try:        num_atoms = [int(x) for x in lines[5].split()]        line_at = 6    except ValueError:        symbols = [x for x in lines[5].split()]        num_atoms = [int(x) for x in lines[6].split()]        line_at = 7    nat = sum(num_atoms)    #    if lines[line_at][0].lower() == 's':        line_at += 1    #    if (lines[line_at][0].lower() == 'c' or lines[line_at][0].lower() == 'k'):        is_scaled = False    else:        is_scaled = True    #    line_at += 1    #    positions = []    for i in range(line_at, line_at + nat):        pos = [float(x) for x in lines[i].split()[:3]]        #        if is_scaled:            pos = MAT_m_VEC(T(b), pos)        #        positions.append(pos)    #    poscar_header = ''.join(lines[1:line_at-1]) # will add title and 'Cartesian' later    return nat, vol, b, positions, poscar_header

def parse_env_params(params):    tmp = params.strip().split('_')    if len(tmp) != 4:        print("[parse_env_params]: ERROR there should be exactly four parameters")        sys.exit(1)    #    [first, last, nderiv, step_size] = [int(tmp[0]), int(tmp[1]), int(tmp[2]), float(tmp[3])]    #    return first, last, nderiv, step_size

#### subs for the output from VTST toolsdef parse_freqdat(freqdat_fh, nat):    freqdat_fh.seek(0) # just in case    #    eigvals = [ 0.0 for i in range(nat*3) ]    #    for i in range(nat*3): # all frequencies should be supplied, regardless of requested to calculate        tmp = freqdat_fh.readline().split()        eigvals[i] = float(tmp[0])    #    return eigvals#def parse_modesdat(modesdat_fh, nat):    from math import sqrt    modesdat_fh.seek(0) # just in case    #    eigvecs = [ 0.0 for i in range(nat*3) ]    norms =   [ 0.0 for i in range(nat*3) ]    #    for i in range(nat*3): # all frequencies should be supplied, regardless of requested to calculate        eigvec = []        for j in range(nat):            tmp = modesdat_fh.readline().split()            eigvec.append([ float(tmp[x]) for x in range(3) ])        #        modesdat_fh.readline().split() # empty line        eigvecs[i] = eigvec        norms[i] = sqrt( sum( [abs(x)**2 for sublist in eigvec for x in sublist] ) )    #    return eigvecs, norms#### end subs for VTST#def get_modes_from_OUTCAR(outcar_fh, nat):    from math import sqrt    eigvals = [ 0.0 for i in range(nat*3) ]    eigvecs = [ 0.0 for i in range(nat*3) ]    norms   = [ 0.0 for i in range(nat*3) ]    #    outcar_fh.seek(0) # just in case    while True:        line = outcar_fh.readline()        if not line:            break        #        if "Eigenvectors after division by SQRT(mass)" in line:            outcar_fh.readline() # empty line            outcar_fh.readline() # Eigenvectors and eigenvalues of the dynamical matrix            outcar_fh.readline() # ----------------------------------------------------            outcar_fh.readline() # empty line            #            for i in range(nat*3): # all frequencies should be supplied, regardless of those requested to calculate                outcar_fh.readline() # empty line                p = re.search(r'^\s*(\d+).+?([\.\d]+) cm-1', outcar_fh.readline())                eigvals[i] = float(p.group(2))                #                outcar_fh.readline() # X         Y         Z           dx          dy          dz                eigvec = []                #                for j in range(nat):                    tmp = outcar_fh.readline().split()                    #                    eigvec.append([ float(tmp[x]) for x in range(3,6) ])                    #                eigvecs[i] = eigvec                norms[i] = sqrt( sum( [abs(x)**2 for sublist in eigvec for x in sublist] ) )            #            return eigvals, eigvecs, norms        #    print("[get_modes_from_OUTCAR]: ERROR Couldn't find 'Eigenvectors after division by SQRT(mass)' in OUTCAR. Use 'NWRITE=3' in INCAR. Exiting...")    sys.exit(1)#def get_epsilon_from_OUTCAR(outcar_fh):    epsilon = []    #    outcar_fh.seek(0) # just in case    while True:        line = outcar_fh.readline()        if not line:            break        #        if "MACROSCOPIC STATIC DIELECTRIC TENSOR" in line:            try:                outcar_fh.readline()                epsilon.append([float(x) for x in outcar_fh.readline().split()])                epsilon.append([float(x) for x in outcar_fh.readline().split()])                epsilon.append([float(x) for x in outcar_fh.readline().split()])            except:                from lxml import etree as ET                doc = ET.parse('vasprun.xml')                epsilon = [[float(x) for x in c.text.split()] for c in doc.xpath("/modeling/calculation/varray")[3].getchildren()]            return epsilon    #    raise RuntimeError("[get_epsilon_from_OUTCAR]: ERROR Couldn't find dielectric tensor in OUTCAR")    return 1#if __name__ == '__main__':    from math import pi    from shutil import move    import os    import datetime    import time    #import argparse    import optparse    #    print("")    print("    Raman off-resonant activity calculator,")    print("    using VASP as a back-end.")    print("")    print("    Contributors: Alexandr Fonari  (Georgia Tech)")    print("                  Shannon Stauffer (UT Austin)")    print("    MIT License, 2013")    print("    URL: http://raman-sc.github.io")    print("    Started at: "+datetime.datetime.now().strftime("%Y-%m-%d %H:%M"))    print("")    #    description  = "Before run, set environment variables:\n"    description += "    VASP_RAMAN_RUN='mpirun vasp'\n"    description += "    VASP_RAMAN_PARAMS='[first-mode]_[last-mode]_[nderiv]_[step-size]'\n\n"    description += "bash one-liner is:\n"    description += "VASP_RAMAN_RUN='mpirun vasp' VASP_RAMAN_PARAMS='1_2_2_0.01' python vasp_raman.py"    #    parser = optparse.OptionParser(description=description)    parser.add_option('-g', '--gen', help='Generate POSCAR only', action='store_true')    parser.add_option('-u', '--use_poscar', help='Use provided POSCAR in the folder, USE WITH CAUTION!!', action='store_true')    (options, args) = parser.parse_args()    #args = vars(parser.parse_args())    args = vars(options)    #    VASP_RAMAN_RUN = os.environ.get('VASP_RAMAN_RUN')    if VASP_RAMAN_RUN == None:        print("[__main__]: ERROR Set environment variable 'VASP_RAMAN_RUN'")        print("")        parser.print_help()        sys.exit(1)    print("[__main__]: VASP_RAMAN_RUN='"+VASP_RAMAN_RUN+"'")    #    VASP_RAMAN_PARAMS = os.environ.get('VASP_RAMAN_PARAMS')    if VASP_RAMAN_PARAMS == None:        print("[__main__]: ERROR Set environment variable 'VASP_RAMAN_PARAMS'")        print("")        parser.print_help()        sys.exit(1)    print("[__main__]: VASP_RAMAN_PARAMS='"+VASP_RAMAN_PARAMS+"'")    #    first, last, nderiv, step_size = parse_env_params(VASP_RAMAN_PARAMS)    assert first >= 1,    '[__main__]: First mode should be equal or larger than 1'    assert last >= first, '[__main__]: Last mode should be equal or larger than first mode'    if args['gen']: assert last == first, "[__main__]: '-gen' mode -> only generation for the one mode makes sense"    assert nderiv == 2,   '[__main__]: At this time, nderiv = 2 is the only supported'    disps = [-1, 1]      # hardcoded for    coeffs = [-0.5, 0.5] # three point stencil (nderiv=2)    #    try:        poscar_fh = open('POSCAR.phon', 'r')    except IOError:        print("[__main__]: ERROR Couldn't open input file POSCAR.phon, exiting...\n")        sys.exit(1)    #    # nat, vol, b, poscar_header = parse_poscar_header(poscar_fh)    nat, vol, b, pos, poscar_header = parse_poscar(poscar_fh)    print(pos)    #print poscar_header    #sys.exit(0)    #    # either use modes from vtst tools or VASP    if os.path.isfile('freq.dat') and os.path.isfile('modes_sqrt_amu.dat'):        try:            freqdat_fh = open('freq.dat', 'r')        except IOError:            print("[__main__]: ERROR Couldn't open freq.dat, exiting...\n")            sys.exit(1)        #        eigvals = parse_freqdat(freqdat_fh, nat)        freqdat_fh.close()        #        try:             modes_fh = open('modes_sqrt_amu.dat' , 'r')        except IOError:            print("[__main__]: ERROR Couldn't open modes_sqrt_amu.dat, exiting...\n")            sys.exit(1)        #        eigvecs, norms = parse_modesdat(modes_fh, nat)        modes_fh.close()    #    elif os.path.isfile('OUTCAR.phon'):        try:            outcar_fh = open('OUTCAR.phon', 'r')        except IOError:            print("[__main__]: ERROR Couldn't open OUTCAR.phon, exiting...\n")            sys.exit(1)        #        eigvals, eigvecs, norms = get_modes_from_OUTCAR(outcar_fh, nat)        outcar_fh.close()    #    else:        print("[__main__]: Neither OUTCAR.phon nor freq.dat/modes_sqrt_amu.dat were found, nothing to do, exiting...")        sys.exit(1)    #    output_fh = open('vasp_raman.dat', 'w')    output_fh.write("# mode    freq(cm-1)    alpha    beta2    activity\n")    for i in range(first-1, last):        eigval = eigvals[i]        eigvec = eigvecs[i]        norm = norms[i]        #        print("")        print("[__main__]: Mode #%i: frequency %10.7f cm-1; norm: %10.7f" % ( i+1, eigval, norm ))        #        ra = [[0.0 for x in range(3)] for y in range(3)]        for j in range(len(disps)):            disp_filename = 'OUTCAR.%04d.%+d.out' % (i+1, disps[j])            #            try:                outcar_fh = open(disp_filename, 'r')                print("[__main__]: File "+disp_filename+" exists, parsing...")            except IOError:                if args['use_poscar'] != True:                    print("[__main__]: File "+disp_filename+" not found, preparing displaced POSCAR")                    poscar_fh = open('POSCAR', 'w')                    poscar_fh.write("%s %4.1e \n" % (disp_filename, step_size))                    poscar_fh.write(poscar_header)                    poscar_fh.write("Cartesian\n")                    #                    for k in range(nat):                        pos_disp = [ pos[k][l] + eigvec[k][l]*step_size*disps[j]/norm for l in range(3)]                        poscar_fh.write( '%15.10f %15.10f %15.10f\n' % (pos_disp[0], pos_disp[1], pos_disp[2]) )                        #print '%10.6f %10.6f %10.6f %10.6f %10.6f %10.6f' % (pos[k][0], pos[k][1], pos[k][2], dis[k][0], dis[k][1], dis[k][2])                    poscar_fh.close()                else:                    print("[__main__]: Using provided POSCAR")                #                if args['gen']: # only generate POSCARs                    poscar_fn = 'POSCAR.%+d.out' % disps[j]                    move('POSCAR', poscar_fn)                    print("[__main__]: '-gen' mode -> "+poscar_fn+" with displaced atoms have been generated")                    #                    if j+1 == len(disps): # last iteration for the current displacements list                        print("[__main__]: '-gen' mode -> POSCAR files with displaced atoms have been generated, exiting now")                        sys.exit(0)                else: # run VASP here                    print("[__main__]: Running VASP...")                    os.system(VASP_RAMAN_RUN)                    try:                        move('OUTCAR', disp_filename)                    except IOError:                        print("[__main__]: ERROR Couldn't find OUTCAR file, exiting...")                        sys.exit(1)                    #                    outcar_fh = open(disp_filename, 'r')            #            try:                eps = get_epsilon_from_OUTCAR(outcar_fh)                outcar_fh.close()            except Exception as err:                print(err)                print("[__main__]: Moving "+disp_filename+" back to 'OUTCAR' and exiting...")                move(disp_filename, 'OUTCAR')                sys.exit(1)            #            for m in range(3):                for n in range(3):                    ra[m][n]   += eps[m][n] * coeffs[j]/step_size * norm * vol/(4.0*pi)            #units: A^2/amu^1/2 =         dimless   * 1/A         * 1/amu^1/2  * A^3        #        alpha = (ra[0][0] + ra[1][1] + ra[2][2])/3.0        beta2 = ( (ra[0][0] - ra[1][1])**2 + (ra[0][0] - ra[2][2])**2 + (ra[1][1] - ra[2][2])**2 + 6.0 * (ra[0][1]**2 + ra[0][2]**2 + ra[1][2]**2) )/2.0        print("")        print("! %4i  freq: %10.5f  alpha: %10.7f  beta2: %10.7f  activity: %10.7f " % (i+1, eigval, alpha, beta2, 45.0*alpha**2 + 7.0*beta2))        output_fh.write("%03i  %10.5f  %10.7f  %10.7f  %10.7f\n" % (i+1, eigval, alpha, beta2, 45.0*alpha**2 + 7.0*beta2))        output_fh.flush()    #    output_fh.close()

绘图脚本:

https://github.com/ZeliangSu/VaspRoutine/blob/main/raman-sc/broaden.py(有修改)

#!/usr/bin/env python#def to_plot(hw,ab,gam=0.001,type='lorentzian'):    import numpy as np    #    fmin = min(hw)    fmax = max(hw)    erange = np.arange(fmin-40*gam,fmax+40*gam,gam/10)#np.arange(fmin-40*gam,fmax+40*gam,gam/10)    spectrum = 0.0*erange    for i in range(len(hw)):        if type=='Gaussian':            spectrum += (2*np.pi)**(-.5)/gam*np.exp(np.clip(-1.0*(hw[i]-erange)**2/(2*gam**2),-300,300))        elif type=='Lorentzian':            spectrum += ab[i]*1/np.pi*gam/((hw[i]-erange)**2+gam**2)    #    return erange, spectrum#if __name__ == '__main__':    import numpy as np    import sys    #    hw=np.genfromtxt(sys.argv[1], dtype=float)    cm1 = hw[:,1]    int1 = hw[:,4]    int1 /= np.max(np.abs(int1),axis=0)    Es1,Spectrum1 = to_plot(cm1, int1, 15.0, 'Lorentzian')#    filename = "new-broaden.dat"    print( "Writing", filename)    f = open(filename,'w')    f.write('# freq/cm-1  Intensity \n')
    for i in range(len(Es1)):        f.write('%.5e   %.5e\n' % (Es1[i],Spectrum1[i]))    f.close()    import matplotlib.pyplot as plt      import numpy as np    
    data = np.loadtxt("new-broaden.dat", unpack=True)    
plt.plot(data[0], data[1])     plt.show()

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1483933.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

重学Springboot3-@ConditionalOnXxx条件注解

重学Springboot3-ConditionalOnXxx条件注解 引言常见的条件注解常见的条件注解示例扩展条件注解1. ConditionalOnJndi2. ConditionalOnJava3. ConditionalOnCloudPlatform4. ConditionalOnEnabledResourceChain5. 自定义条件注解 总结 引言 Spring Boot 提供了一组强大的条件注…

2.1 mov、add和sub加减指令实操体验

汇编语言 1. mov操作 1.1 mov移动值 mov指令把右边的值移动到左边 mount c d:masm c: debug r ax 0034 r 073f:0100 mov ax,7t1.2 mov移动寄存器的值 把右边寄存器的值赋值给左边的寄存器 a 073f:0105 mov bx,axt1.3 mov高八位&#xff08;high&#xff09;和低八位&am…

cetos7 Docker 安装 gitlab

一、gitlab 简单介绍和安装要求 官方文档&#xff1a;https://docs.gitlab.cn/jh/install/docker.html 1.1、gitlab 介绍 gitLab 是一个用于代码仓库管理系统的开源项目&#xff0c;使用git作为代码管理工具&#xff0c;并在此基础上搭建起来的Web服务平台&#xff0c;通过该平…

C++_数据类型_布尔类型

作用 布尔数据类型代表真或假的值 bool类型只有两个值&#xff1a; ture 真&#xff08;本质是1&#xff09;false 假 &#xff08;本质是0&#xff09; bool类型占1个字节大小 示例 注意 bool类型&#xff0c;只要是非0的值都代表真

【谈一谈】我们所用的三种工厂模式优缺点

【谈一谈】我们所用的三种工厂模式优缺点 Hello!!大家好啊,好久也没有进行文章的更新了,原因嘛,最近的工作任务量有点大,导致摸鱼充电的时间大量减少,哈哈哈(你别说,这是借口嘛!) 不过,今天是星期六,难的能够在这里分享下最近在工作中,我用到的三种工厂模式(简工抽),有啥区别呢…

国内哪个工具可以平替chatgpt?国内有哪些比较好用的大模型gpt?

我自己试用了很多的平台&#xff0c;发现三个比较好的大模型平台&#xff0c;对普通用户也比较的友好的&#xff0c;而且返回内容相对来说&#xff0c;正确率更高的&#xff0c;并且相关场景插件比较丰富的国内厂商。 本文说的&#xff0c;是我自己觉得的&#xff0c;比较有主观…

linux之进程理解(1)

目录 1. 冯诺依曼体系结构 2. 操作系统(OS) 2.1 概念 2.2 设计OS的目的 2.3 定位 2.4 理解管理 3. 系统调用和库函数概念 4. 补充 1. 冯诺依曼体系结构 我们常见的计算机&#xff0c;如笔记本。我们不常见的计算机&#xff0c;如服务器&#xff0c;大部分都遵守冯诺依曼体…

HCIA-Datacom实验指导手册:8 网络编程与自动化基础

HCIA-Datacom实验指导手册&#xff1a;8 网络编程与自动化基础 一、实验介绍&#xff1a;二、实验拓扑&#xff1a;三、实验目的&#xff1a;四、配置步骤&#xff1a;步骤 1 完成交换机的 Telnet 预配置步骤 2 Python 代码编写 五、结果验证六、windows 计划任务程序配置七、 …

全部都有的子序列

思路&#xff08;双指针&#xff09; 先使用Set来存储总共有多少不同的数字&#xff0c;然后我们使用快慢指针去遍历数组&#xff0c;快指针每次遍历到一个数&#xff0c;将其加入到哈希表&#xff0c;哈希表使用pair存储&#xff0c;第一个元素存数字&#xff0c;第二个元素存…

2024最新算法:鳑鲏鱼优化算法(Bitterling Fish Optimization,BFO)求解23个基准函数(提供MATLAB代码)

一、鳑鲏鱼优化算法 鳑鲏鱼优化算法&#xff08;Bitterling Fish Optimization&#xff0c;BFO&#xff09;由Lida Zareian 等人于2024年提出。鳑鲏鱼在交配中&#xff0c;雄性和雌性物种相互接近&#xff0c;然后将精子和卵子释放到水中&#xff0c;但这种方法有一个很大的缺…

javaweb请求与响应

前言 前面介绍了对应的服务器端的相关代码。这里开始学习服务器端与客户端的数据请求与响应 这里的仅仅是一个简单的调用&#xff0c;并没有经过servelert接口来进行调用&#xff0c;同前面的一样&#xff0c;我们介绍对应的本地服务器进行的部署项目。 代码 //属于简单的不…

【Memory协议栈】Memory Abstraction Interface模块介绍

目录 前言 正文 1.功能简介 2.关键概念 3.关键类型定义 3.1 MemIf_StatusType 3.2 MemIf_JobResultType 3.3 MemIf_ModeType 4.关键API定义 4.1 MemIf_SetMode 4.2 MemIf_Read 4.3 MemIf_Write 4.4 MemIf_Cancel 4.5 MemIf_GetStatus 4.6 MemIf_GetJobResult 4…

2023年NOC大赛软件创意编程(学而思)赛道图形化小高组复赛试题

目录 第一题 闪烁的星星 第二题 聚沙成塔 第三题 画十字

#WEB前端(DIV、SPAN)

1.实验&#xff1a;DIV、SPAN 2.IDE&#xff1a;VSCODE 3.记录&#xff1a; 类? 4.代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdev…

状态机设计原则系列之效率最大化

检测、搬运类设备,自动运行往往都设计状态机,搬运类对设备节拍往往要求很高,这里我们就需要合理的划分状态机了,使我们的执行效率最大化。有关状态机的系列文章可以查看下面相关文章链接: 1、机器流程控制之建立状态机 https://rxxw-control.blog.csdn.net/article/deta…

智能驾驶规划控制理论学习04-基于车辆运动学的规划方法

目录 一、线性二自由度汽车模型&#xff08;自行车模型&#xff09; 1、二自由度模型概述 2、不同参考点下的状态空间方程 3、前向仿真 二、运动基元生成方法 1、杜宾斯曲线&#xff08;Dubins Curve&#xff09; 2、Reeds Shepp Curve 三、多项式曲线&#xff08;Poly…

多线程(进阶四:线程安全的集合类)

目录 一、多线程环境使用ArrayList 二、多线程环境使用队列 三、多线程环境使用哈希表 1、HashMap 2、Hashtable 3、ConcurrentHashMap (1)缩小了锁的粒度 (2)充分使用了CAS原子操作&#xff0c;减少一些加锁 (3)针对扩容操作的一些优化&#xff08;化整为零&#xff…

优选算法|【双指针】283.移动零

题目 283. 移动零 给定一个数组 nums&#xff0c;编写一个函数将所有 0 移动到数组的末尾&#xff0c;同时保持非零元素的相对顺序。 请注意 &#xff0c;必须在不复制数组的情况下原地对数组进行操作。 示例 1: 输入: nums [0,1,0,3,12]输出: [1,3,12,0,0]示例 2: 输入…

基于ssm旅社客房收费管理系统+vue

目 录 目 录 I 摘 要 III ABSTRACT IV 1 绪论 1 1.1 课题背景 1 1.2 研究现状 1 1.3 研究内容 2 2 系统开发环境 3 2.1 vue技术 3 2.2 JAVA技术 3 2.3 MYSQL数据库 3 2.4 B/S结构 4 2.5 SSM框架技术 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2 操作可行性 5 3…

PTA L2-005 集合相似度

给定两个整数集合&#xff0c;它们的相似度定义为&#xff1a;Nc​/Nt​100%。其中Nc​是两个集合都有的不相等整数的个数&#xff0c;Nt​是两个集合一共有的不相等整数的个数。你的任务就是计算任意一对给定集合的相似度。 输入格式&#xff1a; 输入第一行给出一个正整数N…