Programim dhe zhvillim, javascript, python, php, html

Lexoni vlerat në një grup Fortran nga rreshti tjetër pas një ndeshjeje vargu

Po përpiqem të analizoj një skedar hyrës Abaqus dhe të lexoj nyjet e dëshiruara në një grup. Së pari përpiqem të krahasoj një varg dhe nëse përputhet, atëherë dua të lexoj në një numër të panjohur vlerash të plota nga rreshti tjetër.

Një shembull i skedarit të tekstit është paraqitur më poshtë. Dua të lexoj vlerat nën nset=bf1:

** PARTS

*Part, name=Beam

*Nset, nset=bf1, instance=Beam-1

    1,    2,    5,   43,   45,   48,   49,   50,  105,  106, 1189, 1190, 1191, 1192, 1193, 1194

    5275, 5276, 5277, 5278

*Elset, elset=_Surf-3_SNEG, internal, instance=Beam-1

    1,    2,    3,    4,    5,    6,    7,    8,    9,   10,   11,   12,   13,   14,   15,   16

    17,   18,   19,   20,   21,   22,   23,   24,   25,   26,   27,   28,   29,   30,   31,   32

Ajo që po bëj tani është kjo

program nset_parser
    implicit none

    integer, parameter :: rk = selected_real_kind(10,40)
    real(kind=rk), dimension(:), allocatable :: values
    integer ::  ios,l,val, n, nlines
    character(len=80) :: file_name = 'code_check.inp'
    character (len=*), parameter :: search_str = "bf1"
    character(len=5096) :: input_line, line
    character(len=10) :: keyword, get_keyword
    logical :: h_nset=.false.

     
    l = len(search_str)
     
    open(unit=10, file=file_name, status="old", action='read') ! open file
    do 
     read(10, '(a)',iostat=ios) input_line   ! read the lines
     if (ios /=0) exit
     input_line = adjustl(input_line)   
    
     if (input_line(1:1) == '*' .and. input_line(2:2) /= '*') then  ! check if it is a comment line or data line
      keyword=get_keyword(input_line)
      if (trim(keyword) == 'Nset') then
          read(input_line,'(a)') line
          val = index(line, search_str)
          if (val /= 0) then
              h_nset=.true.
              print*, line(val:val+l-1)
          end if
      end if
     end if
    end do

  close(10)
  end program nset_parser

por pas kësaj jam disi i trullosur.

28.11.2020

  • Jam pak i hutuar për atë që po bëni - një kod minimal, i riprodhueshëm por i plotë do të ndihmonte vërtet (shih stackoverflow.com/ ndihmë/shembull-minimal-riprodhues). Të paktën pa deklaratat e variablave është shumë e vështirë të thuash diçka. Por duke pasur parasysh atë që keni, nuk e kuptoj pse nuk mund të lexoni drejtpërdrejt në një varg me numra të plotë me diçka si vlerat read( 10, * ) (1:number_of_values_needed) 28.11.2020
  • Çfarë nuk shkon me kodin tuaj aktual? A është prodhimi i gabuar? Sa gabim? 28.11.2020
  • Aktualisht, kodi gjen emrin e grupit të nyjeve (bf1) që më nevojitet. Pas kësaj do të doja të lexoja në vlerat e plota në grupin e nyjeve. Dhe unë nuk jam në gjendje ta bëj këtë. 29.11.2020

Përgjigjet:


1

Unë e rishkruaja përgjigjen time për të qenë më e përgjithshme. Ky kod do të trajtojë linja të shumta numrash të plotë midis një rreshti me nset=bf1 dhe çdo rreshti tjetër që fillon '*'.

Për shkak se linjat e inteve mund të ndryshojnë në gjatësi, një grup int 2D është i papërshtatshëm. Në vend të kësaj, unë po ruaj të gjitha int-et në një grup 1D dhe ruaj indeksin e grupit të çdo rreshti të ri.

Për të shmangur leximin e çdo gjëje dy herë, unë po rris madhësinë e vargjeve në fluturim nëse është e nevojshme.

Vini re se nëse përpiluesi juaj nuk e mbështet MOVE_ALLOC (Fortran 2003), atëherë do t'ju duhet thjesht të zëvendësoni secilën thirrje me një grup 'shpërndaj, shpërndaj, shpërndaj'.

program nset_parser
    implicit none

    INTEGER ::  ios,l,val, i, n, nlines, comma_idx, next_idx
    INTEGER, ALLOCATABLE :: my_ints(:), line_starts(:), work_ints(:)
    character(len=80) :: file_name = 'code_check.inp'
    character (len=*), parameter :: search_str = "bf1"
    character(len=5096) :: input_line
    character(len=10) :: keyword
    logical :: h_nset=.false.

    l = len(search_str)

    ALLOCATE(line_starts(10), my_ints(1000))
    next_idx = 1
    nlines = 0

    open(unit=10, file=file_name, status="old", action='read') ! open file
    DO 

      ! Read and adjust the line
      read(10, '(a)',iostat=ios) input_line
      if (ios /=0) exit
      input_line = adjustl(input_line)   

      ! Ignore blank lines
      IF(LEN(TRIM(input_line))==0) CYCLE

      ! This section picks up any line beginning *
      ! and either sets or unsets h_nset
      IF (input_line(1:1) == '*' .AND. input_line(2:2) /= '*') THEN  ! check if it is a comment line or data line

        ! Use of keyword below is a little unsafe if
        ! keywords can be longer than 10 chars (the length of 'keyword')
        ! Instead, better to check if input_line(2:5) == Nset
        ! I left it like this in case you want to be able to check multiple
        ! keywords or something.
        comma_idx = INDEX(input_line, ',')
        keyword = input_line(2:comma_idx-1)

        IF (TRIM(keyword) == 'Nset') THEN
          val = INDEX(input_line, search_str)
          IF (val /= 0) THEN
            h_nset=.TRUE.  ! Switch on when nset=bf1 line is found
            CYCLE
          END IF
        END IF
        h_nset = .FALSE.  ! Only reach this point if we are in a * line which isn't nset=bf1
      END IF

      IF(h_nset) THEN
        n = COUNT(TRANSFER(input_line, 'a', LEN(input_line)) == ",") + 1 !cast to chars and count occurrence of comma
        nlines = nlines + 1

        ! Double size of arrays on the fly if necessary
        IF(nlines > SIZE(line_starts)) THEN
          ALLOCATE(work_ints(nlines * 2))
          work_ints(1:SIZE(line_starts)) = line_starts
          CALL MOVE_ALLOC(work_ints, line_starts)
        END IF
        IF(next_idx+n > SIZE(my_ints)) THEN
          ALLOCATE(work_ints(2*SIZE(my_ints)))
          work_ints(1:SIZE(my_ints)) = my_ints
          CALL MOVE_ALLOC(work_ints, my_ints)
        END IF

        line_starts(nlines) = next_idx
        READ(input_line, *) my_ints(next_idx:next_idx+n-1)
        next_idx = next_idx + n
      END IF
    END DO
    close(10)

    ! This helps with the printing below
    line_starts(nlines+1) = line_starts(nlines) + n

    DO i=1, nlines
      PRINT *, my_ints(line_starts(i):line_starts(i+1)-1)
    END DO
  end program nset_parser
29.11.2020
  • Unë mendoj se op u kujdes shumë për strukturën aktuale të skedarit hyrës. Kështu kodi juaj nuk përfshin dy konceptet e mëposhtme: (1) Gjetja e seksionit nset=bf1. (2) Ka numra të plotë në rreshta të shumtë dhe kodi juaj lexohet vetëm në një rresht. 29.11.2020
  • Pika të mira. Unë me të vërtetë thjesht synoja t'i përgjigjesha çështjes së 'leximit të një rreshti ints', pasi mendoj se ata tashmë kanë kod për të identifikuar seksionin 'bf1'. 29.11.2020
  • Unë mendoj se skanimi i linjave të shumta të numrave të plotë nuk është i parëndësishëm. Ndoshta mund ta zgjeroni përgjigjen tuaj për të lexuar disa rreshta njëherësh, p.sh. skanoni derisa rreshti tjetër të fillojë me *Elset. 29.11.2020
  • Kjo është e drejtë. Kodi im skanon skedarët për vargun, por problemi është skanimi i rreshtave të numrave të plotë më poshtë. Gjithashtu, unë kam treguar vetëm dy rreshta në shembull, por mund të ketë numër 'n' rreshtash. Unë jam përpjekur ta bëj këtë, por duket se është pak e vështirë për mua që tani. 29.11.2020
  • Materiale të reja

    Masterclass Coroutines: Kapitulli-3: Anulimi i korutinave dhe trajtimi i përjashtimeve.
    Mirë se vini në udhëzuesin gjithëpërfshirës mbi Kotlin Coroutines! Në këtë seri artikujsh, unë do t'ju çoj në një udhëtim magjepsës, duke filluar nga bazat dhe gradualisht duke u thelluar në..

    Faketojeni derisa ta arrini me të dhënat false
    A e gjeni ndonjëherë veten duke ndërtuar një aplikacion të ri dhe keni nevojë për të dhëna testimi që duken dhe duken më realiste ose një grup i madh të dhënash për performancën e ngarkesës...

    Si të përdorni kërkesën API në Python
    Kërkesë API në GitHub për të marrë depot e përdoruesve duke përdorur Python. Në këtë artikull, unë shpjegoj procesin hap pas hapi për të trajtuar një kërkesë API për të marrë të dhëna nga..

    Një udhëzues hap pas hapi për të zotëruar React
    Në këtë artikull, do të mësoni se si të krijoni aplikacionin React, do të mësoni se si funksionon React dhe konceptet thelbësore që duhet të dini për të ndërtuar aplikacione React. Learning..

    AI dhe Psikologjia — Pjesa 2
    Në pjesën 2 të serisë sonë të AI dhe Psikologji ne diskutojmë se si makineritë mbledhin dhe përpunojnë të dhëna për të mësuar emocione dhe ndjenja të ndryshme në mendjen e njeriut, duke ndihmuar..

    Esencialet e punës ditore të kodit tim VS
    Shtesat e mia të preferuara - Git Graph 💹 Kjo shtesë është vërtet e mahnitshme, e përdor përpara se të filloj të punoj për të kontrolluar dy herë ndryshimet dhe degët më të fundit, mund të..

    Pse Python? Zbulimi i fuqisë së gjithanshme të një gjiganti programues
    Në peizazhin gjithnjë në zhvillim të gjuhëve të programimit, Python është shfaqur si një forcë dominuese. Rritja e tij meteorike nuk është rastësi. Joshja e Python qëndron në thjeshtësinë,..